Spring原始碼-03-容器建立
阿新 • • 發佈:2022-12-06
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容器中註冊了使用者配置類