我有一個spring應用程序。我是autowiring類,他們工作正常。 對於如Spring在服務器啓動時自動裝入一個類
@Controller
public class SearchController {
@Autowired
private EnvironmentControl envControl;
@Autowired
private SearchControl searchControl;
...
但現在我有叫ScheduleServlet服務器啓動類,它使用init方法來安排的東西......
public class SchedulerServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
this.LOGGER.info("timer servlet is initialized ");
try {
InitialContext ic = new InitialContext();
TimerManager tm = (TimerManager) ic.lookup("java:comp/env/tm/TimerManager");
Timer timer = tm.schedule(new GlobalTemplateScheduler(), 0, 3600000);// one hour interval
System.out.println("Timer..... " + timer);
}
...
在此我GlobalTemplateScheduler類有計劃執行timerExpired方法每間隔一小時後。
public class GlobalTemplateScheduler implements TimerListener {
@Autowired
private TemplateControl templateControl;
@Override
public void timerExpired(Timer timer) {
try {
templateControl.updateMappings(names);
} catch (Exception e) {
this.LOGGER.error(e.getMessage());
e.printStackTrace();
}
...
所以我必須autowire templateControl我得到空。這應該在服務器啓動時發生。
而且裏面updateMappings有(這是工作在瀏覽器請求正常,但需要做的是在服務器啓動時),也自動裝配作爲構造帶參數的數據源對象。
注:我不能用了ApplicationListener接口。
任何建議將真正幫助。
謝謝。
你可以通過調用new實例化你的GlobalTemplateScheduler。這意味着它在你的控制之下,而不是Spring的。正如您已經發現的那樣,自動裝配註釋在這種情況下不起作用。您必須製作GlobalTemplateScheduler和您的SchedulerServlet Spring bean並對它們進行註釋。請注意:如果此應用程序在羣集中運行,則每個實例都有一個「全局」調度程序。 – duffymo