核心类,BeanDefinition注册器,全部的BeanDefinition都是调用这个类去注册。缓存
注册后面用到的组件包括:app
1.ConfigurationClassPostProcessor 中主要解析注解了@Configuration的类,并对其类上的其余注解解析工具
2.AutowiredAnnotationBeanPostProcessor @Autowired和@Value的依赖注入post
3.RequiredAnnotationBeanPostProcessor 对注解了@Required的setter方法进行校验,setter方法的值必须填充不然抛出BeanInitializationException异常测试
4.CommonAnnotationBeanPostProcessor对注解了@PostConstruct,@PreDestroy,@Resource等Java自带注解的类的解析并执行ui
ConfigurationClassPostProcessor 中主要解析注解了@Configuration的类,并对其类上的其余注解解析日志
AutowiredAnnotationBeanPostProcessor @Autowired和@Value的依赖注入对象
RequiredAnnotationBeanPostProcessor 对注解了@Required的setter方法进行校验,setter方法的值必须填充不然抛出BeanInitializationException异常blog
CommonAnnotationBeanPostProcessor对注解了@PostConstruct,@PreDestroy,@Resource等Java自带注解的类的解析并执行接口
初始化容器的方法
建立环境变量,环境变量做用能够利用@Profile来指定开发环境
获取BeanFactory,BeanFactory真正实现BeanDefinition的注册器,AnnotationConfigApplicationContext都是委托BeanDefinition去处理的。
主要功能给beanFactory注册一些组件
2.注册EL表达式解析组件。
3.注册ApplicationContextAwareProcessor组件,此组件的做用是对于实现了Aware的接口的bean注入参数,支持EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware。
4.调用ignoreDependencyInterface方法忽略注入ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware,EnvironmentAware时的@Required注解的强制校验
5.注册BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext,做用是生成bean后注入bean用。
6.注册Environment,systemProperties(map),systemEnvironment(map),做用是生成bean后利用名称注入bean用。
功能跟prepareBeanFactory同样,部分ApplicationContext会对其扩展。
获取全部的扩展 BeanDefinitionRegistryPostProcessor或BeanFactoryPostProcessor的bean并建立及初始化,而后调用其方法将BeanDefinitionRegistry或ConfigurableListableBeanFactory设置进去。
主要做用将BeanPostProcessor注册到BeanFactory,BeanPostProcessor的做用,就是对已经建立的bean对象作初始化前和初始化后的修改。
1.添加BeanPostProcessorChecker到BeanPostProcessor容器,其做用就是打印一个警告日志,其警告内容就是在全部BeanPostProcessor还没被初始化彻底以前,有的bean已经初始化了并未被以后以后初始化的BeanPostProcessor所捕获。测试了下这种状况会发生在实现BeanPostProcessor的bean引用其余bean。
2.获取用户的BeanPostProcessor并添加到BeanPostProcessor容器。
3.加到ApplicationListenerDetectorr到BeanPostProcessor容器,其做用就是将未被registerListeners()步骤忽略的懒加载的添加ApplicationListener到ApplicationEventMulticaster里。
主要做用是初始化MessageSource,MessageSource功能就是国际化。
1.若是用户配置的bean中有name为"messageSource"的MessageSource类型的bean,则建立初始化并做为ApplicationContext主MessageSource
2.若是用户没配置则建立一个空的MessageSource
初始化ApplicationEventMulticaster,ApplicationEventMulticaster里存的是ApplicationListener的集合,ApplicationListener后续流程会添加。
2.若是用户没配置则建立一个SimpleApplicationEventMulticaster。
扩展点方法,特定的ApplicationContext初始化其余特殊bean
主要功能是添加ApplicationListener到ApplicationEventMulticaster里。
1.用户指定的ApplicationListener
2.查找非懒加载的ApplicationListener的bean的name,添加到ApplicationEventMulticaster。这里的只是获取了ApplicationListener的name,实际上仍是未被建立的。这里的查找非懒加载的bean其实未生效,须要将总开关allowEagerClassLoading开启。
主要做用是对还未被建立及初始化的非lazy加载的bean进行初始化。
1.初始化ConversionService类型的bean,ConversionService是类型转化工具。
2.初始化LoadTimeWeaverAware,初始化自定义的LoadTimeWeaverAware
3.设置tempClassLoader为空,tempClassLoader是开启LoadTimeWeaver才会设置,其做用是是加载class类改变原先的双亲委派模式,使其加载其镜像class,这样保证LoadTimeWeaver的织入功能在开启前也能进行对class的类型判断等操做,在织入后也能保证捕获到真正的class类的加载。
4.冻结beanDefinition,其做用是在或调用getBeanNamesForType获取beanName时优先走缓存,且全部的beanName都固定且不期待被修改。
5.建立及初始化的非lazy加载的bean进行初始化
主要功能是触发对应的事件
1.初始化生命周期处理器,LifecycleProcessor。
2.触发生命周期开始事件,即lifecycle的start事件。
3.发送刷新事件,即触发全部ApplicationListener的刷新事件。
4.若是配置了MBean,这注册到MBeanServer,MBeanServer是暴露接口的方法,能够经过jmx协议查看和调用,这里主要是暴露了ApplicationContext的注册信息供开发者查看。