Spring容器初始化流程
//容器启动类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class)
点进去可以看到有两个方法
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
//将配置类封装成为beanDefinition,然后放到DefaultListableBeanFactory容器内的
//private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);缓存中
register(annotatedClasses);
//进行容器的初始化工作
refresh();
}
具体refresh的逻辑
// Allows post-processing of the bean factory in context subclasses.
//允许在上下文子类中对bean工厂进行后处理 默认空实现
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
//将工厂processors创建并注册到容器中
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
//注册用于拦截bean创建的beanProcessors
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
//初始化所有非懒加载的单利bean
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
//发布对应的事件
finishRefresh();
一、初始化容器的后置处理器
首先看invokeBeanFactoryPostProcessors(beanFactory)
顾名思义是将工厂相关的processors创建并注册:
具体的会初始化两类后置处理器
- BeanDefinitionRegistryPostProcessor 负责beanDefinition注册的后置处理器
- BeanFactoryPostProcessor 负责beanFactory容器的后置处理器
ConfigurationClassPostProcessor是BeanDefinitionRegistryPostProcessor的实现类
负责的配置类@Bean,@ComponentScan…等注解的解析封装成为beanDefinition
如果有多个BeanDefinitionRegistryPostProcessor的实现的话创建的顺序遵循
- 实现PriorityOrdered接口
- 实现Ordered接口
- 普通的实现类
以PriorityOrdered举例:
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//如果是实现PriorityOrdered的话,
//beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)
//创建bean,getBean方法后续再说。。。。。
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
可以看到ConfigurationClassPostProcessor就是实现了PriorityOrdered的
public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor,
PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware
创建好了processor之后循环遍历postProcessBeanFactory方法
以ConfigurationClassPostProcessor举例:
ConfigurationClassPostProcessor中有个ConfigurationClassParser(配置类的解析器)
- 首先看是否有贴component注解,有的话就解析当前类的内部类(内部类必须是@configuration或者@Bean才会创建)
- 看当前类是否有PropertySources注解,和配置文件相关的注解
- 看当前类是否是ComponentScans注解,解析packages,
- @Import ,importSelector ImportBeanDefinitionRegistrar类
- ImportResource类
- 解析@Bean
- 接口的