BeanPostProcessor 的各类型执行时机

1、实例化之前:InstantiationAwareBeanPostProcessor

【执行时机】:实例化之前执行
【调用方法】:Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
【使用场景】:不希望由 Spring 来实例化对象,在 Spring 实例化之前,由自己实例化对象
【注意事项】:一旦返回自己创建的 bean,那么 Spring 就会直接返回该 bean

2、初始化之前:BeanPostProcessor.postProcessBeforeInitialization

【执行时机】:初始化之前执行
【调用方法】:default Object postProcessBeforeInitialization(Object bean, String beanName)
【注意事项】:只有返回了对象,才会继续执行其他的 BPP 的 postProcessBeforeInitialization 方法,否则会直接结束循环

3、初始化之后:BeanPostProcessor.postProcessAfterInitialization

【执行时机】:初始化之后执行
【调用方法】:default Object postProcessAfterInitialization(Object bean, String beanName)
【注意事项】:只有返回了对象,才会继续执行其他的 BPP 的 postProcessAfterInitialization 方法,否则会直接结束循环

@Import 注解的扩展

实现了 ImportSelector 接口的类

【使用方式】:集成这个 ImportSelector 接口,在 selectImports 方法中返回类的全限定名,即可向 Spring 容器中注册 bean

  1. @Override
  2. protected String[] selectImports(AdviceMode adviceMode) {
  3. switch (adviceMode) {
  4. case PROXY:
  5. // 向 Spring 中添加了 AutoProxyRegistrar 和 ProxyTransactionManagementConfiguration 两个 bean
  6. return new String[] {AutoProxyRegistrar.class.getName(),
  7. ProxyTransactionManagementConfiguration.class.getName()};
  8. case ASPECTJ:
  9. return new String[] {determineTransactionAspectClass()};
  10. default:
  11. return null;
  12. }
  13. }

实现了 ImportBeanDefinitionRegistrar 接口的类

  • ImportBeanDefinitionRegistrar 类只能通过其他类 @Import 的方式来加载,通常是启动类或配置类
  • 该类拥有注册 bean 的能力
    1. @Override
    2. public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
    3. BeanDefinitionRegistry registry) {
    4. registry.registerBeanDefinition(beanName, beanDefinition);
    5. }

普通类

如果 @Import 中指定的是一个普通类,那么就会直接注册到 Spring 容器中去

InitializingBean 接口

afterPropertiesSet()

当继承了 InitializingBean 接口的 bean 的属性被初始化后,会调用 afterPropertiesSet 方法
【执行时机】:Constructor > @PostConstruct > InitializingBean > init-method

DisposableBean 接口

destroy()

当继承了 DisposableBean 接口的 bean 的属性被初始化后,会调用 destroy 方法
【执行时机】:@PreDestory > DisposableBean > destory-method

SmartInitializingSingleton 接口

afterSingletonsInstantiated()

当所有单例 bean 都实例化完成以后会调用一次