web应用中java多线程并发处理业务时,容易抛出NullPointerException。
原因:
线程中的Spring Bean没有被注入。web容器在启动时,没有提前将线程中的bean注入,在线程启动之前,web容器是无法感知的。
解决方案:
方法一、在声明成员变量的时候,将其定义为static的。(据说不可行)
方法二、将线程设置为主程序的内部类。
在外部类中注入bean,这样在内部类线程中就可以“共享”这个对象。
方法三、定义一个工具类,使用静态工厂方法通过getBean获得bean对象。
问题说明 :
在spring框架进行项目开发,平时遇到了需要批量处理的数据的时候,会选择多线程进行数据批跑,但是会发现,启动多线程后,线程会出现service或者mapper文件注入失败的问题,导致线程启动失败,其中bean的注入方式选择的是spring常规的注解@Autowired进行注入
原因分析 :
web容器在启动应用时,spring容器是无法感知多线程的那些bean的,所以多线程的bean类无法获取spring容器的上下文,并不能通过@Autowired注入需要的bean
解决方案 :
直接在线程中获取bean
Service service = ApplicationContext.getBean(ServiceImpl.class);