spring boot 源碼分析-------ApplicationContext

上下文ConfigurableApplicationContext的建立。web

context = createApplicationContext();
 1     protected ConfigurableApplicationContext createApplicationContext() {
 2         Class<?> contextClass = this.applicationContextClass;
 3         if (contextClass == null) {
 4             try {
 5                 contextClass = Class.forName(this.webEnvironment
 6                         ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
 7             }
 8             catch (ClassNotFoundException ex) {
 9                 throw new IllegalStateException(
10                         "Unable create a default ApplicationContext, "
11                                 + "please specify an ApplicationContextClass",
12                         ex);
13             }
14         }
15         return (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
16     }

根據webEnvironment建立對應的上下文。web應用建立的是下面這個類型的上下文。spring

    public static final String DEFAULT_WEB_CONTEXT_CLASS = "org.springframework."
            + "boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext";

看AnnotationConfigEmbeddedWebApplicationContext的構造方法。app

1     public AnnotationConfigEmbeddedWebApplicationContext() {
2         this.reader = new AnnotatedBeanDefinitionReader(this);
3         this.scanner = new ClassPathBeanDefinitionScanner(this);
4     }

須要建立一個reader和一個scanner。this

從上面的代碼能夠看出兩個構造方法的參數都是上下文。這裏看下這個上下文類的繼承實現關係。看出上下文是包含BeanDefinitionRegistry的功能。lua

 

AnnotatedBeanDefinitionReader用於操做BeanDefinition。spa

ClassPathBeanDefinitionScanner用於掃描路徑下的文件,利用classLoader加載類而後生成BeanDefinition。代理

看下AnnotatedBeanDefinitionReader,主要包含的BeanDefinitionRegistry實際操做BeanDefinition的、ConditionEvaluator用於完成條件註解的解析和判斷(也就是處理註解的)。code

1     public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
2         Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
3         Assert.notNull(environment, "Environment must not be null");
4         this.registry = registry;
5         this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
6         AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
7     }

 看下ClassPathBeanDefinitionScanner。blog

1     private final BeanDefinitionRegistry registry;
2 
3     private BeanDefinitionDefaults beanDefinitionDefaults = new BeanDefinitionDefaults();
4 
5     private String[] autowireCandidatePatterns;
6 
7     private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
8 
9     private ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver();

主要包換的也就是BeanDefinitionRegistry、autowireCandidatePatterns、beanNameGenerator、scopeMetadataResolver都是爲了解析類轉換成BeanDefinition服務的。繼承

建立事後的context包含以下內容:

能夠看到beanFactory已經被建立。

裏面的beanDefinationMap只包換初始META-INFO裏面的六個類。

context實現了BeanDefinition的接口,可是並無持有BeanDefinitionMap,是DefaultListableBeanFactory裏面持有的,也就是實際操做的是DefaultListableBeanFactory裏面的BeanDefinition。DefaultListableBeanFactory是GenericApplicationContext持有的。

看GenericApplicationContext也能夠發現,對於BeanDefinition實際的操做都在DefaultListableBeanFactory裏,GenericApplicationContext對DefaultListableBeanFactory作了代理。

相關文章
相關標籤/搜索