1.如何将Spring Bean注入到线程中:
2.如何在Spring Bean内部启动一个线程。
以下是我的代码:
MyThread.java
@Component
public class MyThread implements Runnable {
@Autowired
ApplicationContext applicationContext;
@Autowired
SessionFactory sessionFactory;
public void run() {
while (true) {
System.out.println("Inside run()");
try {
System.out.println("SessionFactory : " + sessionFactory);
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(10000);
System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我正在从下面的类中调用
run
方法(如果我在调用Spring bean内部的线程时遵循错误的方法,请提出建议)。@Component
public class MyServiceCreationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext().getParent() == null) {
System.out.println("\nThread Started");
Thread t = new Thread(new MyThread());
t.start();
}
}
}
Spring没有在MyThread
类上执行依赖注入
TaskExecutor
,将要执行的任务实例(一个Runnable
或Callable
)传递给它来执行。这样,您就可以使用支持在servlet容器中使用线程的方式。接下来,您应该将bean设置为@Scope("prototype")
,并在启动线程之前使用ApplicationContext
来获取一个实例。现在,您正在在Spring范围之外自己创建一个新实例。 - M. DeinumApplicationContext
... 你可以直接将上下文@Autowire
到你的MyServiceCreationListener
中,并使用该实例获取bean。我从未说过你应该创建一个新实例! - M. Deinum