Spring 在多线程中,bean的注入问题 使用SSM框架,在Service层需要另开一个线程,在线程中使用@Resource或者@Autowired注入全部为NULL,
@Component public class UserThreadTask implements Runnable { @Autowired private UserThreadService userThreadService; @Override public void run() { AdeUser user = userThreadService.get("0"); System.out.println(user); } }
Spring不能在线程中注入
spring在启动时会在主程序中注入bean,但是线程类是不会注入的,只能通过getBean获取
解决方案一
静态代码块手动获得bean
private static UserThreadTask userThreadTask; //静态代码块加载 static{ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); userThreadTask = (UserThreadTask) context.getBean("userThreadTask"); } // 线程池执行 fixedThreadPool.execute(userThreadTask);
解决方案二
把要注入的 Service,通过构造传过去,代码如下:
public class UserThreadTask implements Runnable { private UserThreadService userThreadService; public UserThreadTask(UserThreadService userThreadService) { this.userThreadService = userThreadService; } @Override public void run() { AdeUser user = userThreadService.load("0"); System.out.println(user); } }
Thread t = new Thread(new UserThreadTask(userThreadService)); t.start();
解决方案三
@Service class UserThreadTask{ load(); }
使用
fixedThreadPool.execute(new Runnable() { @Override public void run() { try { userThreadTask.load(); } catch (InterruptedException e) { e.printStackTrace(); } } });
解决方案四
将线程设置为主程序的内部类。 在外部类中注入bean,这样在内部类线程中就可以“共享”这个对象。
@Service class UserThreadTask{ //这两个为线程所需要的Bean @Resource TestDao testDao; @Resource NeedDap needDao; public void serviceExecute(){ //在这里开启线程,执行操作 ThreadExample te = new ThreadExample(); te.start(); } //内部类 private class ThreadExample extends Thread{ public ThreadExample(){ //也可以在构造函数中传入参数 } public void run(){ //这里为线程的操作 //就可以使用注入之后Bean了 } } }