springboot2 随时随地获取applicationContext,以及优先加载某些bean

关于获取applicationContext

主要就是:

(1)新建个类,实现ApplicationContextAware接口

接口只需重写下面这个方法,参数中就有我们要的context,保存到静态变量就行

  1.  
    public static ApplicationContext applicationContext;
  2.  
     
  3.  
    @Override
  4.  
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  5.  
    System.out.println("开始保存到静态变量");
  6.  
    ApplicationContextUtil.applicationContext = applicationContext;
  7.  
    }

(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项目

posted @ 2021-01-04 09:14  🍊爱吃橙子的丸子  阅读(341)  评论(0编辑  收藏  举报