目录
1. 前言
BeanPostProcessor
后置处理器可用于 bean
初始化前后进行逻辑增强。Spring
提供了 BeanPostProcessor
接口的很多实现类,例如 AutowiredAnnotationBeanPostProcessor
用于 @Autowired
注解的实现,AnnotationAwareAspectJAutoProxyCreator
用于 Spring AOP
的动态代理等等
它有力的支撑了 Spring AOP
的实现,所以了解学习 BeanPostProcessor
接口非常有必要
2. BeanPostProcessor
接口
2.1. BeanPostProcessor
的源码
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
postProcessBeforeInitialization()
和postProcessAfterInitialization()
这两个方法分别是在Spring
容器中的bean
初始化前后执行;Spring
容器中的每一个bean
对象初始化前后,都会执行BeanPostProcessor
接口的实现类中的这两个方法- 也就是说
postProcessBeforeInitialization()
方法会在bean
实例化和属性填充完成之后,自定义初始化方法之前被调用,而postProcessAfterInitialization()
方法会在自定义初始化方法之后被调用 - 当容器中存在多个
BeanPostProcessor
的实现类时,会按照它们在容器中注册的顺序执行
2.2. 自定义 BeanPostProcessor
后置处理器
2.2.1. 实现 BeanPostProcessor
接口
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
System.out.println("执行了postProcessBeforeInitialization方法......" + beanName + "=>" + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
System.out.println("执行了postProcessAfterInitialization方法......" + beanName + "=>" + bean);
return bean;
}
}
2.2.2. 创建实体类
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("执行了Cat的无参构造器............");
}
// 实现DisposableBean接口的方法,会在容器关闭的时候进行调用
@Override
public void destroy() throws Exception {
System.out.println("执行了Cat的destroy方法............");
}
public void destroyOne() throws Exception {
System.out.println("执行了Cat的destroyOne方法............");
}
// 实现InitializingBean接口的方法,会在bean创建完成,并且属性都赋好值以后进行调用
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("执行了Cat的afterPropertiesSet方法............");
}
public void init() throws Exception {
System.out.println("执行了Cat的init方法............");
}
}
2.2.3. 创建配置类
@Configuration
public class IOCLifeCycleConfigOne {
@Bean(initMethod = "init", destroyMethod = "destroyOne")
public Cat cat() {
return new Cat();
}
}
2.2.4. 测试结果
@SpringBootTest
@RunWith(value = SpringRunner.class)
public class IOCLifeCycleOneTest {
@Test
public void test02() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(IOCLifeCycleConfigOne.class);
Cat cat = (Cat) applicationContext.getBean("cat");
System.out.println(cat);
// 关闭容器
applicationContext.close();
}
}
test02()
方法测试结果
自定义后置处理器测试结果
- 首先执行无参构造器
- 由于
Cat
类没有属性,所以没有属性填充的日志。故而接下来在初始化方法之前调用了我们自己实现的postProcessBeforeInitialization()
方法 - 此时没有
@PostConstruct
注解来指定初始化之前的方法,所以接下来执行实现了InitializingBean
接口的afterPropertiesSet()
的自定义初始化方法 - 再下来就会执行
@Bean
注解所指定的自定义初始化方法 - 不用多想,初始化方法已完成执行了,再执行
postProcessAfterInitialization()
方法