问题描述

    项目中很多地方都用到了异步方式或多线程,也就是开启新线程处理一些业务。在新线程中,用spring注解@Autowire注入Bean会抛出nullPointerException,也就是Spring Bean没有被注入,bean对象的值为null。

原因分析

    web容器在启动应用时,并没有提前将线程中的bean注入

解决方案

    使用静态方法直接取的容器中的spring对象

    1. 定义工具类如下,并且需要配置成spring中的bean:

/**
 * 获取spring对象的工具类
 */
@Component
public class FrameSpringBeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        applicationContext = arg0;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        return (T) applicationContext.getBean(name);
    }

    public static <T> T getBean(Class<T> cls) {
        return applicationContext.getBean(cls);
    }
}

    2. 线程中获取bean:

final WmsOrderService wmsOrderService = FrameSpringBeanUtil.getBean(WmsOrderService.class);
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐