盘点Spring/Boot的那些常用扩展点

通过@Bean声明了 , 并且和属性分别指定到了类的方法和方法
@Bean( = “”,= “”)
() {
new ();
}
测试
class{
public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//将 LifeCycle 注册到容器中applicationContext.register(Application.class);applicationContext.refresh();// 关闭上下文 , 触发销毁操作applicationContext.close();}@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")public LifeCycle lifeCycle() {return new LifeCycle();}@Beanpublic User user() {return new User();}
}
执行结果:
对象被创建了
Aware接口起作用 , t被调用了 , 此时user=com....User@
@注解起作用 , 方法被调用了
接口起作用 , 方法被调用了
@Bean#()起作用 , 方法被调用了
@注解起作用 , 方法被调用了
接口起作用 , 方法被调用了
@Bean#()起作用 , 方法被调用了
分析结果
通过测试的结果可以看出 , Bean在创建和销毁的过程当我们实现了某些接口或者加了某些注解 , 就会回调我们实现的接口或者执行的方法 。
同时 , 在执行t的时候 , 能打印出User对象 , 说明User已经被注入了 , 说明注入发生在t之前 。
这里画张图总结一下Bean创建和销毁过程中调用的顺序 。
回调顺序
红色部分发生在Bean的创建过程 , 灰色部分发生在Bean销毁的过程中 , 在容器关闭的时候 , 就会销毁Bean 。
这里说一下图中的Aware接口指的是什么 。其余的其实没什么好说的 , 就是按照这种方式配置 , 会调用对应的方法而已 。
Aware接口是指以Aware结尾的一些提供的接口 , 当你的Bean实现了这些接口的话 , 在创建过程中会回调对应的set方法 , 并传入响应的对象 。
这里列举几个Aware接口以及它们的作用
接口 作用
are 注入
注入isher事件发布器
注入
注入Bean的名称
有了这些回调 , 比如说我的Bean想拿到 , 不仅可以通过@注入 , 还可以通过实现are接口拿到 。
通过上面的例子我们知道了比如说@注解、@注解、@注解的作用 , 但是它们是如何在不同的阶段实现的呢?接着往下看 。
 , 中文名 Bean的后置处理器 , 在Bean创建的过程中起作用 。
是Bean在创建过程中一个非常重要的扩展点 , 因为每个Bean在创建的各个阶段 , 都会回调及其子接口的方法 , 传入正在创建的Bean对象 , 这样如果想对Bean创建过程中某个阶段进行自定义扩展 , 那么就可以自定义来完成 。
说得简单点 , 就是在Bean创建过程中留的口子 , 通过这个口子可以对正在创建的Bean进行扩展 。只不过Bean创建的阶段比较多 , 然后接口以及他的子接口、就提供了很多方法 , 可以使得在不同的阶段都可以拿到正在创建的Bean进行扩展 。
来个Demo
现在需要实现一个这样的需求 , 如果Bean的类型是User , 那么就设置这个对象的属性为 ”三友的java日记“ 。
那么就可以这么写:
class r{
@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof User) {//如果当前的Bean的类型是 User  , 就把这个对象 username 的属性赋值为 三友的java日记((User) bean).setUsername("三友的java日记");}return bean;}