1.前言
这个类在spring ioc容器中是重中之重。
首先他是实现BeanDefinitionRegistryPostProcessor接口,那么就会实现这个接口的这两个方法。
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
postProcessBeanDefinitionRegistry方法可以拿到BeanDefinitionRegistry对象 容器里所有的BeanDefinition,再进行过滤解析工作。
以支持 @Component / @ComponentScan / @Import / @ImportResource 以及@Configuration,@Bean等注解功能。
2.过滤BeanDefinition集合
先遍历容器中的所有BeanDefinition,如果类上存在@Component / @ComponentScan / @Import / @ImportResource 或者有@Bean的方法,将他的 BeanDefinition,加入 待解析BD集合
image2.1 获取BeanDefinition里 类的metadata元数据对象
这个对象里会收集类的所有元数据 信息,这里最主要的是获取 类上的注解,这里可以看到当前解析的bean是有@Component注解的
image2.2 判断是否有@Configuration 注解
如果有Configuration注解,会往BeanDefinition对象里的设置一个变量
org.springframework.context.annotation.ConfigurationClassPostProcessor.configurationClass -> full
image2.3.判断是否有@Component / @ComponentScan / @Import / @ImportResource / 某个方法有Bean注解
如果满足上诉注解条件,会往BeanDefinition对象里的设置一个变量
org.springframework.context.annotation.ConfigurationClassPostProcessor.configurationClass -> lite
image2.3.1 isConfigurationCandidate(metadata)
1. 判断类上是否有@Component / @ComponentScan / @Import / @ImportResource 注解
image遍历这个集合,看是否有匹配的,这个集合在静态代码块里 初始化的,就是这四个注解
image2.判断方法上是否@Bean注解
image最终过滤 完成,加入到待解析的beanDifination集合中
image
网友评论