1 BeanDefinitionRegistryPostProcessor

  1. BeanDefinitionRegistryPostProcessor
  2. 实现该接口的类需要重写以下方法
  3. void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
  4. spring 中调用的时机:
  5. spring 初始化容器之后,解析Class 为一个BeanDefinition 之前的时候去执行,
  6. spring 中有一个开天辟地的类 ConfigurationClassPostProcessor 就是实现了该接口,
  7. ConfigurationClassPostProcessor 通过重写 这个方法,
  8. 第一步:去扫描加了 @Configuration 注解的这些类,判断是否是AnnotatedBeanDefinition类型的,将这些类去打上 Lite/Full 的属性,以便后续使用
  9. 第二步:去实现扫描basePackage下的加了 @Service @Controller @Component 的这些类
  10. 将这些类变成为一个BeanDefinition 注册到 Spring BeanDefinitionMap中去
  11. 第三步:
  12. 去解析 @import
  13. 实现 ImportSelector接口的
  14. 实现 ImportBeanDefinitionRegistrar 接口的 这些类的方法,将对应的bean 解析为BeanDefinition,注册到BeanDefinitionMap
  15. 注意: 在新的Mybatis-spring 的框架中,也使用了到了这个接口
  16. MapperScannerConfigurer 这个扫描配置类 也实现了这个接口!
  17. 重写了postProcessBeanDefinitionRegistry() 用于创建扫描器对象,去扫描mybatis 里的那些接口转化为BeanDefinition到容器中去
  18. 作用:
  19. 有了参数 registry 的对象,就能手动向spring容器添加 自定义的BeanDefinition
  20. registry 提供了 添加的 API,但是一般我们不调用 因为在spring里的执行顺序太早了,笔者没有碰到这种需求

2 BeanFactoryPostProcessor

  1. BeanFactoryPostProcessor 该接口是 BeanDefinitionRegistryPostProcessor的父接口,
  2. 表示只要实现了上面1的接口的类,都必实现了这个接口
  3. 实现该接口的类需要重写以下方法
  4. void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
  5. spring 中调用的时机:
  6. 在执行完了子类重写的方法之后,也就是扫描了一圈BeanDefinition 之后去执行
  7. 我们开天辟地的ConfigurationClassPostProcessor 类重写的 postProcessBeanFactory()方法里面干了这些事情
  8. 标记为 Full 全配置类的 BeanDefinition 会在这边做神奇的事情
  9. 我们的APPConfig 里面 会有 @Bean 返回 我们要创建的对象,但是spring是默认单例的
  10. 那如果有
  11. A(){
  12. B();
  13. return new A();
  14. }
  15. B(){
  16. return new B();
  17. }
  18. 这种情况,spring就会使用ASM框架(Cglib动态代理)的方式去解决创建Bean的问题
  19. 这里也是一个spring 里面 AOP 的具体实现,也是spring中循环注入的一个地方
  20. 作用:
  21. 此时BeanDefinitionMap 中已经有了大部分Class对应 BeanDefinition了,
  22. 我们就可以 通过 beanFactory.getBeanDefinition("在BDMap中的名字");来获取BeanDefinition
  23. 来设置这些BD属性

后置处理器的调用时机:

第一次调用后置处理器:

作用:判断正在实列化的bean是否需要被代理
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#resolveBeforeInstantiation
后置处理器和方法:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

第二次调用后置处理器:

作用:推断创建这个bean的构造方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#determineConstructorsFromBeanPostProcessors
后置处理器和方法:
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

第三次调用后置处理器:

作用:合并BeanDefinition
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#applyMergedBeanDefinitionPostProcessors
后置处理器和方法:
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

第四次调用后置处理器:

作用:循环依赖,暴露一个工厂,用这个工厂去获取bean的实例
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#getEarlyBeanReference
后置处理器和方法:
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

第五次调用后置处理器:

作用:属性注入,判断这个BeanDefinition 是否允许属性注入
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#populateBean
后置处理器和方法:
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

第六次调用后置处理器:

作用:执行属性注入 @Autowired和@Resource
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#populateBean
后置处理器和方法:
InstantiationAwareBeanPostProcessor#postProcessProperties

第七次调用后置处理器:

作用:调用各种Aware接口和执行@PostConstruct 和我们自己的实现beanPostProcessor的before方法的地方
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#applyBeanPostProcessorsBeforeInitialization
后置处理器和方法:
BeanPostProcessor#postProcessBeforeInitialization

第八次调用后置处理器:

作用:动态代理Proxy和我们自己的实现beanPostProcessor的after方法的地方
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#applyBeanPostProcessorsAfterInitialization
后置处理器和方法:
postProcessAfterInitialization