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

通过@Bean声明了,并且和属性分别指定到了类的方法和方法
1
2
3
4
@Bean( ="",="")
() {
();
}
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
on {
([] args) {
=();
//将注册到容器中
.(.class);
.();
// 关闭上下文,触发销毁操作
.close();
}
@Bean( ="",="")
() {
();
}
@Bean
user() {
();
}
}
执行结果:
1
2
3
4
5
6
7
8
对象被创建了
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日记“ 。
那么就可以这么写:
1
2
3
4
5
6
7
8
9
10
11
12
13
{
@
( bean,) {
if() {
//如果当前的Bean的类型是 User ,就把这个对象的属性赋值为 三友的java日记
((User) bean).("三友的java日记");
}
;
}
}
测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
on {
([] args) {
=();
//将 r 和 User 注册到容器中
.(r.class);
.(User.class);
.();