Spring源码-03-容器创建
注解Bean方式
public class AnnotationCtxMain02 {
public static void main(String[] args) {
new AnnotationConfigApplicationContext(MyCfg02.class);
}
}
// 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
一 基础组件
// 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); // 路径扫包器
}
// GenericApplicationContext.java
public GenericApplicationContext() {
super();
this.beanFactory = new DefaultListableBeanFactory();
}
// AbstractApplicationContext.java
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
也就是如图
二 注解Bean读取器
完成了2个工作
- 向IoC容器中注册了用于处理注解Bean这种场景下的后置处理器
- 向IoC容器中注册了用户配置类