我有一个正在运行的Spring 3 Web应用程序。所有bean都被正确注入,一切正常(所有Web服务调用都正常工作)。
在扩展应用程序时,我需要添加可以启动的线程&通过网络服务停止。
在线程中我需要注入一些Spring bean。这些是服务(用@Service注释)。在我的applicationContext中,通过组件扫描检测bean:
<context:component-scan base-package="<package>">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
但是当我尝试在线程中注入bean(使用@Resource)时,它们总是为'null'(Spring不会注入它们)。线程已启动但初始化时失败。
我还尝试通过在代码中加载applicationContext来注入它们:(应用程序上下文位于'src / main / resources')
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:*applicationContext.xml");
if(applicationContext.containsBean("BeanName")) {
beanObject = (BeanClass) applicationContext.getBean("BeanName");
} else {
//Exception
}
有没有人知道如何在线程中注入bean?或者是不是可以在一个线程中注入bean?
提前致谢!
答案 0 :(得分:1)
最好将业务逻辑(依赖于您的服务的代码)与管理线程的基础架构代码分开。
例如,您可以为业务逻辑声明实现Runnable
的bean,然后在需要启动Thread
时使用它。
但是,手动启动Thread
也不是一个好习惯。最好使用线程池。实际上,Spring为线程池和异步执行提供了一些内置支持,以便您可以利用它,请参阅25. Task Execution and Scheduling。