这里分析容器创建前期的具体流程及源码
  
新建容器调用链 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class)
该类为我们做了什么?
1:构造方法)
i1…org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext
i2…org.springframework.context.support.GenericApplicationContext#GenericApplicationContext() 调用父类的构造方法
i3…org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() 自己的构造方法
i3.1…org.springframework.context.annotation.AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader 为bean定义读取器赋值
i3.1.1…org.springframework.context.annotation.AnnotatedBeanDefinitionReader#getOrCreateEnvironment 创建环境  
 
i3.2…org.springframework.context.annotation.ConditionEvaluator   创建一个条件计算器对象
i3.2.1…this.registry = registry;  初始条件计算器的bean定义注册器
i3.2.2…this.beanFactory = deduceBeanFactory(registry);  初始化bean工厂
i3.2.3…this.environment = (environment != null ? environment : deduceEnvironment(registry)); 为环境对象赋值
i3.2.4…this.resourceLoader = (resourceLoader != null ? resourceLoader : 
deduceResourceLoader(registry)); 为资源加载器赋值    
 
i3.3…AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);为容器中注册系统的bean定义信息
 
I4… this.scanner = new ClassPathBeanDefinitionScanner(this); 创建类路径下的bean定义扫描器      
I4.1…   org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#registerDefaultFilters注册包扫描默认的规则 
I4.2… org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setEnvironment 设置环境
I4.3… org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setResourceLoader 设置资源加载器
 
i5…org.springframework.context.annotation.AnnotatedBeanDefinitionReader#register 使用i3.1步生成的bean定义读取器注册配置类
 
详细源码 i1AnnotationConfigApplicationContext i1>org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext
创建IOC容器对象
1 2 3 4 5 6 7 8 public  AnnotationConfigApplicationContext (Class<?>... annotatedClasses)   {	     		this (); 		 		register(annotatedClasses); 		 		refresh(); 	} 
 
i2>org.springframework.context.support.GenericApplicationContext#GenericApplicationContext() 调用父类的构造方法 生成一个IOC容器
1 2 3 4 public  GenericApplicationContext ()   {	     		this .beanFactory = new  DefaultListableBeanFactory(); 	} 
 
i3>org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() 自己的构造方法
1 2 3 4 5 6 public  AnnotationConfigApplicationContext ()   {		 		this .reader = new  AnnotatedBeanDefinitionReader(this ); 		 		this .scanner = new  ClassPathBeanDefinitionScanner(this ); 	} 
 
i3.1AnnotatedBeanDefinitionReader i3.1>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader 为bean定义读取器赋值
1 2 3 public  AnnotatedBeanDefinitionReader (BeanDefinitionRegistry registry)   {		this (registry, getOrCreateEnvironment(registry)); 	} 
 
i3.1.1>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#getOrCreateEnvironment 创建环境
1 2 3 4 5 6 7 private  static  Environment getOrCreateEnvironment (BeanDefinitionRegistry registry)   {		Assert.notNull(registry, "BeanDefinitionRegistry must not be null" ); 		if  (registry instanceof  EnvironmentCapable) { 			return  ((EnvironmentCapable) registry).getEnvironment(); 		} 		return  new  StandardEnvironment(); 	} 
 
i3.2>org.springframework.context.annotation.ConditionEvaluator   创建一个条件计算器对象
1 2 3 4 5 6 public  ConditionContextImpl (BeanDefinitionRegistry registry, Environment environment, ResourceLoader resourceLoader)   {			this .registry = registry; 			this .beanFactory = deduceBeanFactory(registry); 			this .environment = (environment != null  ? environment : deduceEnvironment(registry)); 			this .resourceLoader = (resourceLoader != null  ? resourceLoader : deduceResourceLoader(registry)); 		} 
 
i3.3> AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);为容器中注册系统的bean定义信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 public  static  Set<BeanDefinitionHolder> registerAnnotationConfigProcessors ( 			BeanDefinitionRegistry registry, Object source)   {                  		DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry); 		if  (beanFactory != null ) { 			if  (!(beanFactory.getDependencyComparator() instanceof  AnnotationAwareOrderComparator)) { 				beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); 			} 			 			if  (!(beanFactory.getAutowireCandidateResolver() instanceof  ContextAnnotationAutowireCandidateResolver)) { 				beanFactory.setAutowireCandidateResolver(new  ContextAnnotationAutowireCandidateResolver()); 			} 		} 		Set<BeanDefinitionHolder> beanDefs = new  LinkedHashSet<BeanDefinitionHolder>(8 );                   		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)); 		}                  注册解析@Required  注解的处理器 		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)); 		}                   		 		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)); 		}                   		 		if  (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) { 			RootBeanDefinition def = new  RootBeanDefinition(); 			try  { 				def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, 						AnnotationConfigUtils.class.getClassLoader())); 			} 			catch  (ClassNotFoundException ex) { 				throw  new  IllegalStateException( 						"Cannot load optional framework class: "  + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex); 			} 			def.setSource(source); 			beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)); 		}                   		if  (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) { 			RootBeanDefinition def = new  RootBeanDefinition(EventListenerMethodProcessor.class); 			def.setSource(source); 			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME)); 		}          		if  (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) { 			RootBeanDefinition def = new  RootBeanDefinition(DefaultEventListenerFactory.class); 			def.setSource(source); 			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME)); 		} 		return  beanDefs; 	} 
 
i4ClassPathBeanDefinitionScanner i4>  this.scanner = new ClassPathBeanDefinitionScanner(this); 创建类路径下的bean定义扫描器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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); 	} 
 
i4.1registerDefaultFilters org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#registerDefaultFilters注册包扫描默认的规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 protected  void  registerDefaultFilters ()   {	     		this .includeFilters.add(new  AnnotationTypeFilter(Component.class)); 		ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader(); 		try  { 		     			this .includeFilters.add(new  AnnotationTypeFilter( 					((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean" , cl)), false )); 			logger.debug("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning" ); 		} 		catch  (ClassNotFoundException ex) { 			 		} 		try  { 		     			this .includeFilters.add(new  AnnotationTypeFilter( 					((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named" , cl)), false )); 			logger.debug("JSR-330 'javax.inject.Named' annotation found and supported for component scanning" ); 		} 		catch  (ClassNotFoundException ex) { 			 		} 	} 
 
i5>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#register 使用i3.1步生成的bean定义读取器注册配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public  void  registerBean (Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers)   {		AnnotatedGenericBeanDefinition abd = new  AnnotatedGenericBeanDefinition(annotatedClass); 		if  (this .conditionEvaluator.shouldSkip(abd.getMetadata())) { 			return ; 		} 		ScopeMetadata scopeMetadata = this .scopeMetadataResolver.resolveScopeMetadata(abd); 		abd.setScope(scopeMetadata.getScopeName()); 		String beanName = (name != null  ? name : this .beanNameGenerator.generateBeanName(abd, this .registry)); 		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd); 		if  (qualifiers != null ) { 			for  (Class<? extends Annotation> qualifier : qualifiers) { 				if  (Primary.class == qualifier) { 					abd.setPrimary(true ); 				} 				else  if  (Lazy.class == qualifier) { 					abd.setLazyInit(true ); 				} 				else  { 					abd.addQualifier(new  AutowireCandidateQualifier(qualifier)); 				} 			} 		}          		BeanDefinitionHolder definitionHolder = new  BeanDefinitionHolder(abd, beanName); 		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this .registry); 		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this .registry); 	}