java - 如何在线程中注入(inject)Spring Bean

标签 java multithreading spring javabeans

我有一个正在运行的 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/

相关文章:

java - 使用java获取主url

Java套接字编程中的线程间通信问题

Java程序流程

java - Controller 不支持 JAVA。 Spring MVC

java - 如何自动记录 @Entity 上的任何更改?

java - 使用分隔符将json字符串存储在Hadoop文件中

java - 如何让Task取消自己的 future 呢?

Java线程可以调用公共(public)数据收集器对象的方法吗?

java - 是什么使得从静态初始化程序初始化对象引用以安全地发布对象?

java - 初始响应后,Tomcat 每次响应都相同