我有一个Runnable(即一个实现Runnable的类)。我通过调用其Contstructor来使用此Runnable的一个SpringBean。我想把这个Runnable变成一个Spring Bean。
例如。
Class RunTest implements Runnable {
Object object;
public RunTest(Object a){
this.object=a;
}
public void run() {
//using attributes of a
}
}
现在我有一个春豆
@Named
Class TestSpringBean {
public void someMethod(){
Object a;
new RunTest(a)
}
}
我可以将RunTestClass注入TestSpringBean并使用。
答案 0 :(得分:1)
将类RunTest
标记为@Component
,将其实例注入类TestSpringBean
中,并在方法someMethod
*中完成配置:
@Component
class RunTest implements Runnable {
public RunTest() {}
}
class TestSpringBean {
@Autowired
private RunTest runnable;
public void someMethod() {
...
runnable.set(a);
}
}
*请注意,您应该获得一个已配置的组件,因此不需要其他配置。这是一个单例实例,因此此处的更改也将反映在其他地方。
换句话说,单身人士应保持无状态。这就是为什么应该通过找到一种获取完整对象或从任务类中排除该对象的方法来修改此简单解决方案的原因。
**您可以将范围更改为"prototype"
,但是Spring仍然无法提供完全配置的实例。这就提出了一个问题:Spring应该完全管理此类吗?
***如@lucumt所指出的,请确保该类对于组件扫描机制是可见的。
答案 1 :(得分:0)
说明:
TaskExecutor
是与执行者打交道的抽象, 从Spring 2.0开始引入。Spring的TaskExecutor接口可以看作与java.util.concurrent.Executor
接口相同。 Spring发行版中还包含许多TaskExecutor
的内置实现。在这里阅读: https://docs.spring.io/spring/docs/2.5.x/reference/scheduling.html
方法:
1。为您的spring应用程序定义一个TaskExecutor
配置:
@Configuration
public class MultiThreadConfig {
@Bean
public TaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(5);
executor.setThreadNamePrefix("DEFAULT");
executor.initialize();
return executor;
}
}
2。定义您可以作为原型运行
确保将“对象”更改为所需的自定义类型
@Component
@Scope("prototype")
public class RunTest implements Runnable {
@Autowired
ChangeObjectToYourNeed object ;
public RunTest(ChangeObjectToYourNeed a) {
this.object = a;
}
@Override
public void run() {
// your code
}
}
3。将执行程序注入您的服务以执行可运行实例:
@Service
public class AsynService {
@Autowired
private TaskExecutor taskExecutor;
@Autowired
private ApplicationContext applicationContext;
public void executeAsync() {
RunTest runTest = applicationContext.getBean(MyThread.class);
taskExecutor.execute(runTest);
}
}