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容器添加 自定义的BeanDefinition
registry 提供了 添加的 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