2

我有一个正在运行的 Spring 3 Web 应用程序。所有 bean 都已正确注入,并且一切正常(所有 Web 服务调用都正常工作)。

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

在线程中,我需要注入一些 Spring bean。这些 bes 是服务(用@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?

提前致谢!

4

1 回答 1

1

最好将业务逻辑(取决于您的服务的代码)与管理线程的基础设施代码分开。

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

但是,Thread手动启动 s 也不是一个好习惯。最好改用线程池。实际上,Spring 为线程池和异步执行提供了一些内置支持,因此您可以利用它,请参阅25. 任务执行和调度

于 2012-04-13T17:01:09.870 回答