bean 的后置处理器:在所有 bean 初始化前后进行一些处理工作
一、环境搭建
- 创建一个maven项目,引入5.x版本的spring依赖
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.24</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.24</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.24</version>
</dependency>
</dependencies>
- 编写代码
- 重写后置类处理器:自定义处理时的操作
CustomBeanPostProcessor
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 非自定义bean,直接返回
if (!(bean instanceof Person)) {
return bean;
} else {
// 自定义,打印日志
System.out.println("bean 初始化前\t" + beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 非自定义bean,直接返回
if (!(bean instanceof Person)) {
return bean;
} else {
// 自定义,打印日志
System.out.println("bean 初始化后\t" + beanName);
}
return bean;
}
}
- 编写配置类:将指定类加入ioc容器
MainConfig
@ComponentScan({"com.k3wd.springtest"})
@Configuration
public class MainConfig {
}
- 编写测试的bean
Person
@Component
public class Person {
}
- 测试主类
Test
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
Object person = context.getBean("person");
}
}
二、跟踪调试
打上断点,开始调试
可以看到主线程中入栈的方法并不多。可以一个一个点过去看看,这也是一种阅读源码的好方法:以目的为导向阅读。
前面感兴趣的可以自己读下,我们关注本次的核心
后置处理工作发生在装配之后,初始化之前
可以看到,初始化之前和之后都有调用
三、Spring中的使用
spring中有大量例子
这里举例@AutoWired
注册外部托管的配置方法或字段。