Spring Listen Context Initialization Completion

时间:2017-11-22 04:01:42

标签: java spring spring-mvc

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

我使用ServletContextListener并试图调用一个控制器。但是,由于在contextInitialized方法执行后调用了所有bean初始化,因此它不会出现。

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

需要做什么?

3 个答案:

答案 0 :(得分:0)

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

我假设您要在ControllerAControllerB上调用方法,并在应用启动时将这些方法调用的结果存储在其他位置。

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. 
        */
    }
}

答案 1 :(得分:0)

如果要在应用程序启动完成之前准确执行某段代码,可以CommandLineRunner

@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
    }
}

答案 2 :(得分:0)

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

@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 **********");
    }

}