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