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。我說沒有地方你應該創造一個新的實例! –