我有一个MyTask
类,它实现了Runnable
接口,可以在任何给定的时刻实例化许多这样的对象。我想将某些属性自动注入到MyTask
类中。
但是我认为,如果我用@Component
标记MyTask
,它会变成一个由Spring管理的单例,对吗?这不是我想要的,我需要由TaskExecutor运行的这个类的许多独立实例。
所以我的问题是:
- a)我对
@Component
注解的理解基本上是错误的吗?它不会使MyTask
成为一个由Spring管理的单例吗? - b)是否有其他注解我应该使用,以便Spring检测到
@Autowired
并注入属性? - c)Spring的自动注入不适用于像
MyTask
这样的非单例容器/类吗?
更新#1 - 这些方法都不起作用:
public class MyTask implements Runnable { // 我希望这个类不是单例的
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; // 这是应该被注入的单例bean
@Override
public void run() {
// BLAH是NULL,这不应该是NULL,这不是我想要的
// 这是有道理的,因为Spring从来不知道它必须处理这个类
//
}
}
@Component
public class MyTask implements Runnable { // 我希望这个类不是单例的
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; // 这是应该被注入的单例bean
@Override
public void run() {
// 这个可以工作,但现在MyTask是单例的:(
}
}
@Component
@Scope("prototype")
public class MyTask implements Runnable { // 我希望这个类不是单例的
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; // 这是应该被注入的单例bean
@Override
public void run() {
// BLAH是NULL,这不应该是NULL,这不是我想要的
}
}
更新#2 - 在等待更多关于如何以简单的方式做到这一点的建议时,我正在研究:使用AspectJ和Spring对领域对象进行依赖注入
作为替代方案。
首先,使用@Component声明并被Spring组件扫描捕获的Bean,默认情况下将成为Spring管理的单例。
我不知道你如何使用MyTask,但在你的情况下使用AspectJ有些过度,而且将MyTask声明为Spring管理的Bean没有太多意义。另一种做法是:
将MyTask定义为一个普通的Java类,并添加一个构造函数来初始化依赖的blah。
在使用MyTask的地方自动装配blah,并在每次执行任务时实例化一个MyTask对象,具体代码如下:
//在另一个Spring Bean中默认使用单例作用域自动装配MyTask的依赖 @Autowired private SomeSpecialSpringConfiguredConnectionClass blah //创建任务并手动装配blah executor.submit(new MyTask(blah))