其实这个问题跟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方法,执行代码,可以在控制台看到输出。