Spring源码-01-Bean容器

1 类关系

2 宏观视角

3 容器创建

注解Bean方式

1
2
3
4
5
6
public class AnnotationCtxMain02 {

public static void main(String[] args) {
new AnnotationConfigApplicationContext(MyCfg02.class);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// AnnotationConfigApplicationContext.java
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
/**
* 完成容器的基础组件初始化
* - beanFactory
* - 实现是DefaultListableBeanFactory
* - reader
* - 注解Bean读取
* - BeanDefinition注入容器
* - scanner
* - 指定路径扫包
* - BeanDefinition注入容器
*/
this();
this.register(componentClasses); // Bean读取器读取注解Bean将类信息封装BeanDefinition注入容器 配置类
/**
* 到此为止完成了准备工作
* - 向IoC容器中注册了用于处理注解Bean这种场景下的后置处理器
* - 向IoC容器中注册了用户配置类
*
*
*/
super.refresh();
}

容器创建主要3个步骤

  • 基础组件初始化
  • 注入BeanDefinition
  • refresh

3.1 基础组件

1
2
3
4
5
6
7
8
// AnnotationConfigApplicationContext.java
public AnnotationConfigApplicationContext() {
super();
StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
this.reader = new AnnotatedBeanDefinitionReader(this); // 注解Bean读取器
createAnnotatedBeanDefReader.end();
this.scanner = new ClassPathBeanDefinitionScanner(this); // 路径扫包器
}
1
2
3
4
5
// GenericApplicationContext.java
public GenericApplicationContext() {
super();
this.beanFactory = new DefaultListableBeanFactory();
}
1
2
3
4
// AbstractApplicationContext.java
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}

也就是如图:

3.2 注解Bean读取器

AnnotatedBeanDefinitionReader组件

完成了2个工作:

  • 向IoC容器中注册了用于处理注解Bean这种场景下的后置处理器
  • 向IoC容器中注册了用户配置类
后置处理器类
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
InitDestroyAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory

4 refresh


Spring源码-01-Bean容器
https://bannirui.github.io/2023/03/11/Spring源码-01-Bean容器/
作者
dingrui
发布于
2023年3月11日
许可协议