Spring注解驱动开发之BeanPostProcessor后置处理器

目录

  • 1. 前言
  • 2. `BeanPostProcessor` 接口
    • 2.1. `BeanPostProcessor` 的源码
    • 2.2. 自定义 `BeanPostProcessor` 后置处理器
      • 2.2.1. 实现 `BeanPostProcessor` 接口
      • 2.2.2. 创建实体类
      • 2.2.3. 创建配置类
      • 2.2.4. 测试结果

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() 方法测试结果

Spring注解驱动开发之BeanPostProcessor后置处理器_第1张图片
自定义后置处理器测试结果

Spring注解驱动开发之BeanPostProcessor后置处理器_第2张图片

  • 首先执行无参构造器
  • 由于Cat 类没有属性,所以没有属性填充的日志。故而接下来在初始化方法之前调用了我们自己实现的 postProcessBeforeInitialization() 方法
  • 此时没有 @PostConstruct 注解来指定初始化之前的方法,所以接下来执行实现了 InitializingBean 接口的 afterPropertiesSet() 的自定义初始化方法
  • 再下来就会执行 @Bean 注解所指定的自定义初始化方法
  • 不用多想,初始化方法已完成执行了,再执行 postProcessAfterInitialization() 方法

你可能感兴趣的:(spring,#,应用,spring)