1.如何将弹簧豆注入线程弹簧不会将豆注入线程
2.如何在弹簧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
方法(请建议,如果我错了如下的appraoch调用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();
}
}
}
春不执行依赖注入MyThread
类
首先,您不应该在容器中自己启动线程。理想情况下,你应该有一个'TaskExecutor'来传递任务的实例('Runnable'或'Callable')来执行。这样你就可以使用受支持的方式使用线程和servlet容器。接下来,你应该让你的bean'@Scope(“prototype”)'并且在启动线程之前使用'ApplicationContext'来获得一个实例。您现在正在Spring的范围外创建一个新实例。 –
,但你说在下面的评论中说,由于内存问题和怪异的应用程序行为不创建新的上下文 –
我在哪里说你应该创建一个新的'ApplicationContext' ...你可以'@ Autowire'上下文到你的'MyServiceCreationListener'并使用该实例从中获取bean。我说没有地方你应该创造一个新的实例! –