环境:Spring5.3.3 + Java8
项目中如果某些Bean中需要使用如ApplicationContext,Environment,Bean$ t DFactory等对象时我们都会去实现相关的Awaq , L j l Cre接口/ v / S Y F + ! n对象,然后\ @ s | | *就可以直接使用对应c k o的对象了,今天我们就来开始它的实现原理。
使用示例:
- @Component
- publicclassBeanAI / : C = V P S .wareimplementsApplicationContextAware{
- privateApQ t \ & p G Y rplicatn 9 \ Z 3 6 _ k KionContextctx;
- @Override
- publicvoidsetApplicationContext(ApplicationContF q I d lextappl! Q H = c X H a GicationContext)throwsBeansException{
- this.ctx=applicationContext;
- Sys3 O N i h Otem.outF L + c j I p /.println(this.ctx2 { | S);
- }
- }
入口函数:
- publicstaticvoidN & Tmain(String[]args){
- AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext("com.pack");
- ctx.getBean(BeanAware.class);
- ctx.close();
- }
正如上面这样只要你实现对应的*Aware接口就可以使用相应的接口对象了。
先来看看Aware接口的层级结j 6 5 + o构:
接j s J @ m着我们查看
AnnotationCoA x Q ) D WnfigApplicationContext的0 Q \ = v U 9 l 6父类AbstractApplicationContext
在父类中,有] Q A R如下方法:
上面选中的就是处理AK { T : Bware相关接口类了。查看这类
- classApplicationContextAwarePr. ( , FoceG O M w EssorimplementsBeanPostProcessor
该类是个Bean后处理器,在bean实例化及依赖注入完成% ` G L p [后、在任何初始化代码(比如配置文件中的init-method)调用之前调用和初始化代码调用之后调用
在初始化之前2 b v B & j w 6方法中先检查Bean是否是响应Aware接口) 5 C B | K \ F的子类,如果不是直接返回;否则进入invokeAwareInterfn s uaces方法
到这里你应该知道了Aware的底层原理了吧
完毕!!!