如何在所有bean初始化之后调用spring控制器?
我使用ServletContextListener
并试图调用一个控制器。但是,由于在contextInitialized
方法执行后调用了所有bean初始化,因此它不会出现。
我在应用程序上下文中从db加载一个变量,该变量具有一些全局值。一旦立即部署应用程序,就必须触发该操作。
需要做什么?
答案 0 :(得分:0)
您可以使用@PostConstruct
阶段来模拟上下文初始化完成。
我假设您要在ControllerA
,ControllerB
上调用方法,并在应用启动时将这些方法调用的结果存储在其他位置。
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 **********");
}
}