收藏

SpringBoot2.1解决普通类中使用注解注入bean报空指

2018-12-16  本文已影响109人  也许________

其实这个问题跟SpringBoot关系不大,在集成了Spring的项目中都会出现该问题,问题的原因是普通类中的注解类没有被Spring进行管理进行初始化,因此未被初始化就使用,所以会报空指针异常。

换一种方式来获得想要注入的bean实例,使用Spring的ApplicationContext(上下文对象)来获取实例,当然直接在普通类中添加上下文的注解也会报空指针,原因是同样的。

首先要解决怎么获得ApplicationContext,自定义一个类实现接口ApplicationContextAware(Spring3.x就已经有该接口),重写方法setApplicationContext,在这个类中可以获取ApplicationContext,具体内容看代码:

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    public static <T> T getBean(Class<T> tClass) {
        return getApplicationContext().getBean(tClass);
    }

}

ps:
自定义类中的@Component必须写,证明该类由Spring进行管理,这样在应用启动后会自动执行setApplicationContext方法对上下文变量进行赋值,该类中还定义了其他两个获取bean的静态方法,如何使用?

@Service
public class TestService {

    Logger logger = LoggerFactory.getLogger(TestService.class);

    public void test() {
        logger.info("进入TestService");
    }

}


public class SendSMSUtil {

    static Logger logger = LoggerFactory.getLogger(SendSMSUtil.class);

    public void test() {
        TestService testService = ApplicationContextProvider.getBean(TestService.class);
        testService.test();
    }

}

SendSMSUtil是普通类,之前直接通过注解注入TestService会报空指针,现在通过ApplicationContextProvider.getBean静态方法获取想要注入的那个类的实例,调用对应的业务方法即可。
ps:
TestService是一个由Spring管理的业务层类,定义了一个test方法,执行代码,可以在控制台看到输出。

上一篇下一篇

猜你喜欢

热点阅读