如何在所有bean初始化后调用spring控制器?
我使用ServletContextListener并试图调用一个控制器。但是,它并不存在,因为所有的bean初始化都是在contextInitialized方法执行后调用的。
我正在应用程序上下文中从db加载一个变量,该应用程序上下文具有一些全局值。一旦立即部署应用程序,就必须触发该操作。
需要做些什么?
发布于 2017-11-26 22:08:13
我使用以下代码实现了我的要求:
@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 **********");
}
}发布于 2017-11-22 06:56:13
您可以使用@PostConstruct阶段来模拟上下文初始化完成。
我假设您希望在ControllerA、ControllerB上调用方法,并将这些方法调用的结果存储在app启动的其他地方。
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.
*/
}
}发布于 2017-11-22 07:01:51
当您想要在应用程序启动完成之前完全执行某些代码时,您可以使用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
}
}https://stackoverflow.com/questions/47426566
复制相似问题