【spring源码分析】二、Spring扩展点的归总
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,但是一般我们不调用
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属性