如何在线程中注入Spring Bean

时间:2012-04-13 16:02:37

标签: java multithreading spring javabeans

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

最好将业务逻辑(依赖于您的服务的代码)与管理线程的基础架构代码分开。

例如,您可以为业务逻辑声明实现Runnable的bean,然后在需要启动Thread时使用它。

但是,手动启动Thread也不是一个好习惯。最好使用线程池。实际上,Spring为线程池和异步执行提供了一些内置支持,以便您可以利用它,请参阅25. Task Execution and Scheduling