springboot(5)提供的扩展接⼝BeanPostProcess接⼝
在每个bean初始化成前后做操作。
如果想在系统中的所有(或者部分bean)初始化前后,做些事情,可继承该接⼝,使⽤⽅式如下图⽰例:
就这样,在每个实例初始化前后,将会执⾏相关打印。
InstantiationAwareBeanPostProcessor接⼝
在Bean实例化前后做⼀些操作。
该接⼝继承了BeanPostProcess接⼝,并在此的基础上⼜增加了3个⽅法,增加了扩展bean的功能。
可以看到,需要实现 5 个⽅法,其中2个⽅法是 BeanPostProcess 接⼝定义的⽅法:在bean初始化的前后执⾏,⽽InstantiationAwareBeanPostProcessor 则新增了 3 个⽅法,分别是 postProcessBeforeInstantiation (实例化之
前),postProcessAfterInstantiation (实例化之后),postProcessPropertyValues (在处理Bean属性之前),开发者可以在这三个⽅法中添加⾃定义逻辑。执⾏顺序为:先实例化,在初始化。即postProcessBeforeInstantiation->postProcessAfterInstantiation->postProcessPropertyValues->postProcessBeforeInitialization->@PostConstruct注解修饰的⽅法(如果有的话)-
>postProcessAfterInitialization。
BeanNameAware、ApplicationContextAware 和 BeanFactoryAware接⼝
针对bean⼯⼚,可以获取上下⽂,可以获取当前bean的id。这三个接⼝都继承⾃ Aware 接⼝,并分别定义了⾃⼰的接⼝定义⽅法。实现这些接⼝就能得到Spring的Bean ⼯⼚、以及应⽤上下⽂等信息。从⽽调⽤getBean⽅法获取Bean。很多项⽬中都使⽤此接⼝做为Spring
的⼯具类。⽐如可以像这么使⽤:
BeanFactoryPostProcessor接⼝
Spring允许在Bean创建之前,读取Bean的元属性,并根据⾃⼰的需求对元属性进⾏改变
所有的bean定义都已经加载了,但是还没有实例化bean。这允许覆盖或添加属性,甚⾄是对初始化bean的属性。参数是什么呢?应⽤程序上下⽂所使⽤的bean⼯⼚。也就是说,我们可以获取某个Bean的定义,然后修改该Bean的定义:⽐如下⾯这样:
InitialingBean、DisposableBean接⼝
springboot aopInitialingBean 在属性设置完毕后做⼀些⾃定义操作。 DisposableBean 在关闭容器前做⼀些操作。
执⾏顺序为:setName、init、afterPropertiesSet,如果和前⾯的TAInstantiationAwareBeanPostProcessor结合起来,则顺序为:
1. 实例化前postProcessBeforeInstantiation
2. 实例化后postProcessAfterInstantiation
3. 处理属性前postProcessPropertyValues
4. 处理属性setName
5. 初始化前postProcessBeforeInitialization
6. @PostConstruct修饰的⽅法
7. 属性设置完毕afterPropertiesSet
8. 初始化后postProcessAfterInitialization
ApplicationListener事件和事件监听
假设在⽤户注册成功后,需要向⽤户发送邮件时,也可以使⽤springboot的事件监听,详情可参考另外⼀篇博⽂springboot⽣命周期和。代码如下:
ApplicationContextInitializer接⼝
应⽤初始化器,在ApplicationContext做refresh之前(prepareContext时),允许我们对ApplicationContext的实例做进⼀步的设置或者处理。详情可参考另外⼀篇博⽂springboot应⽤上下⽂初始化器。最近在项⽬中有这么个需求,项⽬在重构时,需要对某个包下的⼤多数类的⼤多数⽅法进⾏验证,即在进⼊这些类的这些⽅法时,执⾏⼀个验证,如果验证不通过则抛出异常。解决⽅案是在项⽬中使⽤javassist动态字节码技术实现AOP前置操作,但如何将这个验证的AOP代码在springboot启动时(在bean加载前)引⼊spring呢,就是通过⾃定义initializer实现的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。