Spring容器的refresh() 創建刷新
1 prepareRefresh() 刷新前的預處理
1) initProPertySources() 初始化一些屬性設置; 子類定義個性化的屬性設置方法
2) getEnvironment( ) .validateRequiredProperties() 檢驗屬性的合法性
3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器中的一些早期的事件
2 obtainFreshBeanFactory() 獲取BeanFactory
1)refreshBeanFactory() 刷新(創建) BeanFactory
創建了一個this.beanFactory = new DefaultListableBeanFactory()
2) getBeanFactory() 返回剛才GenericApplicationContext 創建的BeanFactory對象
3) 將創建的BeanFactory(DefaultListableBeanFactory)返回
3 prepareBeanFactory(beanFactory); BeanFactory的預准備工作(BeanFactory進行一些設置)
1 設置BeanFactory 的類加載器、支持表達式解析器
2 添加部分BeanPostProcessor[ApplicationContextAwareProcessor]
3 設置忽略的自動裝配的接口 EnvironmentAware、 EmbeddedValueResolverAware
4 注冊可以解析的自動裝配。 直接在任何組件中自動注入: BeanFactory、 ResourceLoader、ApplicationEventPublisher、ApplicationContext
5 添加BeanPostProcessor【ApplicationListenerDetector功能的Processor】
6 添加編譯時的AspectJ
7 給BeanFactory中注冊有些能用的組件
environment【ConfigurableEnvironmetn】
systemProperties 【Map<String, Object>】
systemEnvironment 【Map<String, Object>】]
4 PostProcessoBeanFactory(BeanFactory) BeanFactory准備工作完成后進行的后置處理工作
1) 子類通過重寫這個方法來在BeanFactory創建並又准備完成以后做進一步的設置
到此為止 BeanFactory創建及其預准備工作完成
7 initMessageSource() 初始化MessageSource組件(做國際化功能,消息綁定,消息解析)
1) 獲取BeanFactory
2) 看容器是否有id 為messageSource的 類型是MessageSource的組件
如果有賦值給messageSource 如果沒有自己創建一個DelegatingMessageSource
MessageSource去除估計會配置文件中的某個key值,能按照區域信息獲取
3) 把創建好的MessageSource注冊在容器中 以后獲取國際化配置文件的值的時候,自動注入MessageSource
8 initApplicationEventMulticaster() 初始化時間派發器
1) 獲取BeanFactory
2) 從BeanFactory中獲取applicationEventMulticaster的ApplicationEventMulticaster
3) 如果上一步沒有配置,創建一個SimpleApplicationEventMulticaster
4) 將創建的ApplicationEventMulticaster添加到BeanFactory中,以后其他組件直接注入
9 onRerresh() 留給容器(子類)
1)子類重寫這個方法,在容器刷新的時候可以自定義邏輯
10 registerListeners() 給容器中將所有項目里面的ApplicationListener注冊進來了
1)從容器中拿到所有ApplicationListener
2) 將每個監聽器添加到時間派發器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)
3) 派發之前步驟產生的事件
11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的單實例bean
1)獲取容器中的所有Bean 一次進行初始和創建對象
2)獲取Bdan的定義信息; RootBedanDefinition
3)Bean不是抽象的,是單實例的,懶加載的
1) 判斷是否是FactoryBean 是否實現FactoryBean接口的bean
2)不是工廠Bean 利用getBean(beanName) 創建對象
0) getBean(beanName) IOC.getBean()
1)doGetBean(name, null, null ,false)
2) 先獲取緩存中保存的單實例Bean。 如果能夠獲取到這個Bean之前被創建過(所有創建過的單實例Bean都會被緩存起來)
3)緩存中獲取不到,開始Bean的創建對象流程
4)標記當前bean已經被創建
5) 獲取Bean的定義信息
6) 獲取當前Bean依賴的其他Bean,如果有按照getBean() 把依賴的Bean先創建出來
7) 啟動單實例Bean的創建流程
1) createBean(beanName, mbd , args)
2) Object bean =resolveBeforeINstantiation(beanName, mbdToUse)
簡單總結:
1 Spring容器在啟動時候,賢惠保存素有注冊進來的Bean的定義信息
xml 注解 給容器注冊bean定義信息
2 spring容器會在何時時機創建這些bean
用到這個bean 的時候; 利用getBean創建Bean;創建好以后保存在容器中
統一創建剩下所有的bean的時候; finishBeanFactoryInitialization()
3 后置處理器
1 每一個bean創建完成都會使用各種后置處理器進行處理,來增強bean的功能
處理自動注入 aop功能等 以及支持異步調用的 任務調度的 增強功能注解都是有響應的后置處理器
4 時間驅動模型
ApplicationListener 事件監聽
ApplicationEventMulticaster 事件派發