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

关于获取applicationContext

https://blog.csdn.net/weixin_44761211/article/details/105541601?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

主要就是:

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

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

    public static ApplicationContext applicationContext;

    @Override
    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项目

蓝奏云:https://wws.lanzous.com/i2Uzdjycj5e

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/112085607