核心類,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的註冊信息供開發者查看。