2012-04-13 53 views
2

我有一个正在运行的Spring 3 Web应用程序。所有的bean都被正确地注入,并且所有的东西都是正常的(所有的web服务调用都正常)。如何在线程中注入Spring Bean

扩展应用程序时,我需要添加可以启动的线程&通过Web服务停止。

在线程中,我需要注入一些Spring bean。这些是服务(用@Service注释)。在我的applicationContext通过组件扫描检测到的豆:

<context:component-scan base-package="<package>"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan> 

但是当我尝试在线程他们总是“空”注入豆(使用@Resource)(Spring不将它们注入)。该线程已启动,但在初始化时失败。

我也试图通过在代码加载ApplicationContext中注入他们:(应用程序上下文位于“的src/main /资源”)

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:*applicationContext.xml"); 

if(applicationContext.containsBean("BeanName")) { 

     beanObject = (BeanClass) applicationContext.getBean("BeanName"); 

} else { 

    //Exception 
} 

有没有人有任何想法如何注入豆线程?或者不可能在一个线程中注入bean?

先谢谢了!

+0

[可能的重复](http://stackoverflow.com/a/1377740/248082)。基于这个答案,你的自定义类正在扩展'Thread'。 – nobeh 2012-04-13 16:07:06

回答

1

将业务逻辑(取决于您的服务的代码)与管理线程的基础结构代码分开会更好。

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

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