? ? 近期在做項目的時候榴都,需要用到一個定時器來處理一個定時任務待锈,而定時任務又需要操作數(shù)據(jù)庫,而這里我用了JDK自帶的TimerTask和Timer處理的嘴高,所以需要在TimerTask類中獲取具體的service或者dao Bean竿音。
實現(xiàn)思路,大體分為監(jiān)聽項目啟動事件拴驮、獲取spring項目全局上下文春瞬、獲取具體的Bean 三步:
1、監(jiān)聽項目啟動事件:
這個有好幾種方法套啤,這里用的是實現(xiàn)ServletContextListener(javax.servlet.ServletContextListener)接口的監(jiān)聽器宽气,然后實現(xiàn)該接口的幾個方法(
contextInitialized--監(jiān)聽項目啟動初始化随常。然后要在項目中注冊這個監(jiān)聽器,即在web.xml中配置個listener萄涯,class指向該類绪氛。
這里有個坑點:web.xml中定義這個listener的時候,它的位置一定要在項目加載核心配置文件之后@杂啊T娌臁!即位置至少要在contextConfigLocation這個context-param之后燃逻,或者之后獲取的Context將會為null序目!
2、獲取spring項目全局上下文:
注冊過監(jiān)聽器之后伯襟,要在contextInitialized方法中通過WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)方法獲取WebApplicationContext對象猿涨,這樣我們就獲取到我們想要的全局項目對象了(當然實現(xiàn)這個功能還有別的方法,大家有興趣可以研究下)姆怪,為了方便項目中使用可以在這個類中定義一個私有靜態(tài)的WebApplicationContext對象叛赚,并提供一個公開的get方法。
3片效、獲取具體的Bean
之后我們就可以在TimerTask類中獲取WebApplicationContext對象红伦,通過調用getBean方法獲取想要的Bean了,getBean有多個重載方法淀衣,可以根據(jù)需要昙读,選擇適合自己的那個。
補充:我們定義好的TimerTask類膨桥,也可以在第一步定義的那個監(jiān)聽器的contextInitialized方法中進行注冊蛮浑,這樣也可以保證項目啟動的時候定時任務開始等待執(zhí)行。
----(java開發(fā)小菜鳥只嚣,路過發(fā)現(xiàn)有什么錯誤的地方沮稚,煩請?zhí)岢鰜恚x謝2嵛琛)----