关于获取applicationContext
主要就是:
(1)新建个类,实现ApplicationContextAware接口
接口只需重写下面这个方法,参数中就有我们要的context,保存到静态变量就行
-
public static ApplicationContext applicationContext;
-
-
-
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-
System.out.println("开始保存到静态变量");
-
ApplicationContextUtil.applicationContext = applicationContext;
-
}
(2)加上@Component注解,让spring来生成对象(加载bean)
spring会在bean加载后,自动调用setApplicationContext方法,入参也会自动填好。
(3)后续使用静态变量就好了
其实这有个前提:加载bean后,才能使用静态变量。
有例外吗?有,还很常见。就是在其他bean的构造函数和初始化方法中,使用这个静态变量。
会怎么样?空指针异常。
来看看空指针
解决方法很简单,让工具类bean先加载就好。
https://blog.csdn.net/liuyueyi25/article/details/104970404
大概就是:
(1)新建个类(Bean生命周期控制),实现BeanFactoryAware和InstantiationAwareBeanPostProcessor接口。同时加上@Component注解,让spring来生成对象。
-- 因为实现了InstantiationAwareBeanPostProcessor接口,所以通过@Component让spring加载bean时,会最先加载。
(2)在重写的方法里,主动通过 beanFactory.getBean() 这个方法获取工具类bean(获取bean 会确保执行过 加载bean)。这时候其他bean还没加载呢,那就算是优先加载了。
-- 可以在 setBeanFactory 里写
-- 也可以在 postProcessAfterInstantiation 里写
@DependsOn和@Autowired二选一
用来建立bean依赖,连锁加载bean
最后看看效果
代码 springboot2、maven项目