Spring
# 1 核心流程
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
1
public AnnotationConfigApplicationContext(Class<?>...componentClasses){
this();
register(componentClasses);
refresh();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
1.调用构造函数 this();
主要做的事情:
1)初始化BeanFactory:this.beanFactory = new DefaultListableBeanFactory()
2)初始化BeanDefinition配置类读取器(AnnotatedBeanDefinitionReader)
和扫描器(ClassPathBeanDefinitionScanner scanner)(此处scanner没什么用处,用于外部手动调用。后续会重新new一个scanner去扫描bean定义)
初始化BeanDefinition配置类读取器的时候重点做了2件事
1)初始化ConfigurationClassPostProcessor后置处理器(父类为:BeanFactoryPostProcessor)
此时只是BeanDfinition,后续在refresh时根据BeanDefinition生成实例。
2)初始化其他内置相关BeanDefinition
2. register(componentClasses); 将传入的配置类进行注册,注册为BeanDefinition
配置类有两种情况:
1)带有@Configuration注解的配置类
2)带有@Component,@ImportResouce,@Service,@ComponentScan等注解的配置类
- 在Spring内部把前者称为Full配置类,把后者称为Lite配置类
3.refresh(); IOC容器刷新接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上次更新: 2022/11/24, 17:59:25