美文网首页收藏
SpringBoot2.1解决普通类中使用注解注入bean报空指

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

作者: 也许________ | 来源:发表于2018-12-16 14:17 被阅读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方法,执行代码,可以在控制台看到输出。

    相关文章

      网友评论

        本文标题:SpringBoot2.1解决普通类中使用注解注入bean报空指

        本文链接:https://www.haomeiwen.com/subject/kltxkqtx.html