首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring侦听上下文初始化完成

Spring侦听上下文初始化完成
EN

Stack Overflow用户
提问于 2017-11-22 04:01:41
回答 3查看 112关注 0票数 0

如何在所有bean初始化后调用spring控制器?

我使用ServletContextListener并试图调用一个控制器。但是,它并不存在,因为所有的bean初始化都是在contextInitialized方法执行后调用的。

我正在应用程序上下文中从db加载一个变量,该应用程序上下文具有一些全局值。一旦立即部署应用程序,就必须触发该操作。

需要做些什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-26 22:08:13

我使用以下代码实现了我的要求:

代码语言:javascript
复制
@WebListener
public class StartUpListener implements ServletContextListener {

    private static final Logger logger = Logger.getLogger(StartUpListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("********* context Refreshed **********");

        new Thread(new Runnable() {
            public void run(){
                try {
                    TimeUnit.SECONDS.sleep(10);
                    URL url = new URL ("http://localhost:8080/myapp/loadFeature");
                    URLConnection con = url.openConnection();
                    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        logger.info(inputLine);
                    }
                    in.close();
                } catch (Exception e) {
                    logger.error(e);
                }
            }
        }).start();

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("********* context contextDestroyed **********");
    }

}
票数 0
EN

Stack Overflow用户

发布于 2017-11-22 06:56:13

您可以使用@PostConstruct阶段来模拟上下文初始化完成。

我假设您希望在ControllerAControllerB上调用方法,并将这些方法调用的结果存储在app启动的其他地方。

代码语言:javascript
复制
public class InitializationHook {
    private ControllerA controllerA;
    private ControllerB controllerB;

    @Autowired
    public InitializationHook(ControllerA controllerA, ControllerB controllerB) {
        this.controllerA = controllerA;
        this.controllerB = controllerB;
}

    @PostConstruct
    public void init() {
        //do whatever you want with both the controllers
        controllerA.getGlobalValueFromDB();
        controllerB.doSomethingElse();
        /*
        * At this point, controllerA and controllerB would have been initialized completely 
        * along with their dependencies (could be connections to DB etc) and ready for use. 
        * You don't have to worry about the other beans getting initialized. 
        */
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-11-22 07:01:51

当您想要在应用程序启动完成之前完全执行某些代码时,您可以使用CommandLineRunner

代码语言:javascript
复制
@Component
public class ControllerRunner implements  CommandLineRunner {
    private static final Logger logger = LoggerFactory.getLogger(ControllerRunner.class);

    @Override
    public void run(String...args) throws Exception {
        logger.info("Your application has been started");
        //TODO - call your controller
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47426566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档