近期在做项目的时候,需要用到一个定时器来处理一个定时任务,而定时任务又需要操作数据库,而这里我用了JDK自带的TimerTask和Timer处理的,所以需要在TimerTask类中获取具体的service或者dao Bean。
实现思路,大体分为监听项目启动事件、获取spring项目全局上下文、获取具体的Bean 三步:
1、监听项目启动事件:
这个有好几种方法,这里用的是实现ServletContextListener(javax.servlet.ServletContextListener)接口的监听器,然后实现该接口的几个方法(
contextInitialized--监听项目启动初始化。然后要在项目中注册这个监听器,即在web.xml中配置个listener,class指向该类。
这里有个坑点:web.xml中定义这个listener的时候,它的位置一定要在项目加载核心配置文件之后!!!即位置至少要在contextConfigLocation这个context-param之后,或者之后获取的Context将会为null!
2、获取spring项目全局上下文:
注册过监听器之后,要在contextInitialized方法中通过WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)方法获取WebApplicationContext对象,这样我们就获取到我们想要的全局项目对象了(当然实现这个功能还有别的方法,大家有兴趣可以研究下),为了方便项目中使用可以在这个类中定义一个私有静态的WebApplicationContext对象,并提供一个公开的get方法。
3、获取具体的Bean
之后我们就可以在TimerTask类中获取WebApplicationContext对象,通过调用getBean方法获取想要的Bean了,getBean有多个重载方法,可以根据需要,选择适合自己的那个。
补充:我们定义好的TimerTask类,也可以在第一步定义的那个监听器的contextInitialized方法中进行注册,这样也可以保证项目启动的时候定时任务开始等待执行。
----(java开发小菜鸟,路过发现有什么错误的地方,烦请提出来,谢谢!)----