从普通类中调用IOC容器中的Bean
一、问题
有时候从普通类中使用@Autowired来进行对Bean的自动装配,但是普通类使用该注解时却出现了空指针异常的报错。该对象没有装配IOC容器中的Bean。此时,如果想要在普通类中使用IOC容器里的Bean,需要如何进行操作呢?
二、解决方法
2.1 实现ApplicationContextAware
首先创建一个类来实现ApplicationContextAware,并重写其中的setApplicationContext方法。
@Override
public void setApplicationContext(ApplicationContext context) {
BeanUtils.context = context;
}
并将此类注册称为容器中的组件(这里使用@Component)。此时,此方法类就变成了Bean,springboot会在此类初始化完成之后调用setApplicationContext()方法,从而使得此类中的Application类型的静态变量context实例化,再编写方法getBean()来获取IOC容器中的Bean。
public static <T> T getBean(String name) {
System.out.println("这就是context:" + context);
Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println); //用来查看注入容器中的对象有哪些
return (T) context.getBean(name);
}
2.2 在普通类中进行调用
在普通类中进行调用直接使用ApplicationContextAware实现类中的getBean()方法即可。
PLCData_1000BServiceImp plcData_1000BServiceImp = BeanUtils.getBean("PLCData_1000BServiceImp"); //获取IOC容器中的Bean
注意
需要将实现类放置在与springboot项目启动类的同一个目录下才能够起作用,只有这样才能够扫描到此文件。