上下文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作了代理。