【转】web后台线程中获取spring容器内的bean
有时候需要启动一个后台守护线程,做一些别的事情。这时候怎么获取spring里的Service、Dao、Action等对象?(注意自己new一个是不行的,因为脱离了spring的管理,其中IoC资源都没有被注入)。
一个解决办法是,重新弄一个Spring:
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"applicationContext.xml"));
// 从配置文件中获取对象
IService hello = (IService) factory.getBean("service");
hello.service("Helloween");
factory.destroySingletons();
这是最笨的办法,也是不科学的。这样的话,web中会有两个spring容器,两套service、dao等。
--------------------------------------------------------------
比较科学的办法,是用Spring的方法获取到当前的容器(也是当前应用下唯一的spring容器),并从中获取资源。代码为:
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
IService service = (IService) context.getBean("service");
----------------------------------------------------------------
ContextLoader.getCurrentWebApplicationContext()方法 可以从spring的加载listener中追踪到:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
看一下这个类的代码就知道了。