1 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor实现该接口的类需要重写以下方法void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;spring 中调用的时机:在 spring 初始化容器之后,解析Class 为一个BeanDefinition 之前的时候去执行,spring 中有一个开天辟地的类 ConfigurationClassPostProcessor 就是实现了该接口,ConfigurationClassPostProcessor 通过重写 这个方法,第一步:去扫描加了 @Configuration 注解的这些类,判断是否是AnnotatedBeanDefinition类型的,将这些类去打上 Lite/Full 的属性,以便后续使用第二步:去实现扫描basePackage下的加了 @Service @Controller @Component 的这些类将这些类变成为一个BeanDefinition 注册到 Spring 的BeanDefinitionMap中去第三步:去解析 @import实现 ImportSelector接口的实现 ImportBeanDefinitionRegistrar 接口的 这些类的方法,将对应的bean 解析为BeanDefinition,注册到BeanDefinitionMap 中注意: 在新的Mybatis-spring 的框架中,也使用了到了这个接口MapperScannerConfigurer 这个扫描配置类 也实现了这个接口!重写了postProcessBeanDefinitionRegistry() 用于创建扫描器对象,去扫描mybatis 里的那些接口转化为BeanDefinition到容器中去作用:有了参数 registry 的对象,就能手动向spring容器添加 自定义的BeanDefinitionregistry 提供了 添加的 API,但是一般我们不调用 因为在spring里的执行顺序太早了,笔者没有碰到这种需求
2 BeanFactoryPostProcessor
BeanFactoryPostProcessor 该接口是 BeanDefinitionRegistryPostProcessor的父接口,表示只要实现了上面1的接口的类,都必实现了这个接口实现该接口的类需要重写以下方法void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;spring 中调用的时机:在执行完了子类重写的方法之后,也就是扫描了一圈BeanDefinition 之后去执行我们开天辟地的ConfigurationClassPostProcessor 类重写的 postProcessBeanFactory()方法里面干了这些事情标记为 Full 全配置类的 BeanDefinition 会在这边做神奇的事情我们的APPConfig 里面 会有 @Bean 返回 我们要创建的对象,但是spring是默认单例的那如果有A(){B();return new A();}B(){return new B();}这种情况,spring就会使用ASM框架(Cglib动态代理)的方式去解决创建Bean的问题这里也是一个spring 里面 AOP 的具体实现,也是spring中循环注入的一个地方作用:此时BeanDefinitionMap 中已经有了大部分Class对应 BeanDefinition了,我们就可以 通过 beanFactory.getBeanDefinition("在BDMap中的名字");来获取BeanDefinition,来设置这些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
