springboot原始碼2--ApplicationContext物件初始化過程
本文以AnnotationConfigEmbeddedWebApplicationContext為例來說明初始化過程。首先看下這個類的建構函式。
public AnnotationConfigEmbeddedWebApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
(1)首先看下AnnotatedBeanDefinitionReader這個類的初始化過程,省略呼叫過程,主要是呼叫AnnotationConfigUtils這個類的registerAnnotationConfigProcessors方法。
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, Object source) {
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
......
return beanDefs;
}
這個方法很長,主要是將spring內部的一些類放到DefaultListableBeanFactory中beanDefinitionMap這個map中,供後面解析bean時使用,這裡給出一下注冊的bean。
ConfigurationClassPostProcessor.class
AutowiredAnnotationBeanPostProcessor.class
RequiredAnnotationBeanPostProcessor.class
CommonAnnotationBeanPostProcessor.class
PersistenceAnnotationBeanPostProcessor.class
EventListenerMethodProcessor.class
DefaultEventListenerFactory.class
(2)例項化ClassPathBeanDefinitionScanner類。
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
Environment environment, ResourceLoader resourceLoader) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
this.registry = registry;
if (useDefaultFilters) {
registerDefaultFilters();
}
setEnvironment(environment);
setResourceLoader(resourceLoader);
}
相關文章
- 物件的初始化過程物件
- Feign原始碼解析:初始化過程(一)原始碼
- Feign原始碼解析:初始化過程(二)原始碼
- Java的物件初始化過程Java物件
- Vue 原始碼解讀(2)—— Vue 初始化過程Vue原始碼
- Java 物件初始化的過程介紹Java物件
- Spring MVC原始碼(一) ----- 啟動過程與元件初始化SpringMVC原始碼元件
- 從底層原始碼淺析Mybatis的SqlSessionFactory初始化過程原始碼MyBatisSQLSession
- 解析Java類和物件的初始化過程(轉)Java物件
- 從原始碼角度解析 Springboot 2.6.2 的啟動過程原始碼Spring Boot
- vue 原始碼學習(二) 例項初始化和掛載過程Vue原始碼
- vue 原始碼學習(二) 例項初始化和掛載過程Vue原始碼
- 從SpringBoot原始碼分析 主程式配置類載入過程Spring Boot原始碼
- SpringBoot原始碼分析之配置環境的構造過程Spring Boot原始碼
- vue2.x原始碼解析系列二: Vue元件初始化過程概要Vue原始碼元件
- Spring 原始碼(17)Spring Bean的建立過程(8)Bean的初始化Spring原始碼Bean
- 【spring原始碼學習】spring的IOC容器在初始化bean過程Spring原始碼Bean
- 原始碼包安裝過程原始碼
- MySQL • 原始碼分析 • SHUTDOWN過程MySql原始碼
- Linux 核心排程器原始碼分析 - 初始化Linux原始碼
- SpringBoot啟動流程分析(四):IoC容器的初始化過程Spring Boot
- 【Spring原始碼分析】非懶載入的單例Bean初始化過程(下篇)Spring原始碼單例Bean
- 【Spring原始碼分析】非懶載入的單例Bean初始化過程(上篇)Spring原始碼單例Bean
- jvm 類初始化過程程式碼實戰分析JVM
- 【原始碼】Redis Server啟動過程原始碼RedisServer
- 【原始碼】Redis命令處理過程原始碼Redis
- tomcat原始碼 -- servlet呼叫過程Tomcat原始碼Servlet
- Golang原始碼學習:排程邏輯(一)初始化Golang原始碼
- Spring 原始碼(14)Spring Bean 的建立過程(6)物件的提前暴露Spring原始碼Bean物件
- redis啟動初始化過程Redis
- 初探oracle open初始化過程Oracle
- Spring 原始碼閱讀(二)IoC 容器初始化以及 BeanFactory 建立和 BeanDefinition 載入過程Spring原始碼Bean
- 原始碼|HDFS之NameNode:啟動過程原始碼
- Netty NioEventLoop 建立過程原始碼分析NettyOOP原始碼
- 從Chrome原始碼看DNS解析過程Chrome原始碼DNS
- Runtime原始碼 方法呼叫的過程原始碼
- 深入剖析Vue原始碼 - 完整渲染過程Vue原始碼
- Spring啟動過程——原始碼分析Spring原始碼