5大事件
1)ContextRefreshEvent,當ApplicationContext容器初始化完成或者被刷新的時候,就會發布該事件。
2)ContextStartedEvent,當ApplicationContext啓動的時候發佈事件,即調用ConfigurableApplicationContext接口的start方法的時候
3)ContextStoppedEvent,當ApplicationContext容器停止的時候發佈事件,即調用ConfigurableApplicationContext的close方法的時候
4)ContextClosedEvent,當ApplicationContext關閉的時候發佈事件,即調用ConfigurableApplicationContext的close方法的時候,關閉指的是所有的單例Bean都被銷燬。
5)equestHandledEvent,只能用於DispatcherServlet的web應用,Spring處理用戶請求結束後,系統會觸發該事件。
7種Scope(bean作用域)
Scopebean的scope是指bean的作用域,request、session、global-session是在web服務中使用的scope
- singleton默認情況下是單例模式,這也是使用最多的一種方式;
- prototype多例模式,即每次從beanFactory中獲取bean都會創建一個新的bean。
- request每次請求都創建一個實例,
- session是在一個會話週期內保證只有一個實例。
- global-session在5.x版本中已經不在使用,
- Application保證在一個ServletContext中只創建一個實例。
- Websocket保證在一個WebSocket中只創建一個實例。
4大核心接口/類
- ApplicationContext保存了ioc的整個應用上下文,可以通過其中的beanfactory獲取到任意到bean;
- BeanFactory主要的作用是根據bean definition來創建具體的bean;
- BeanWrapper是對Bean的包裝,一般情況下是在spring ioc內部使用,提供了訪問bean的屬性值、屬性編輯器註冊、類型轉換等功能,方便ioc容器用統一的方式來訪問bean的屬性;
- FactoryBean通過getObject方法返回實際的bean對象,例如motan框架中referer對service的動態代理就是通過FactoryBean來實現的。
7大事務傳播類型
- PROPAGATION_REQUIRED 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。【默認】
- PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
- PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
- PROPAGATION_REQUIRES_NEW 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
- PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。
- PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
- PROPAGATION_NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
5大隔離級別
- ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應【默認】
- ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀【隔離級別最低,併發性能高 】
- ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。【鎖定正在讀取的行】
- ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。【鎖定所讀取的所有行】
- ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。【鎖表】
Spring Context初始化流程
https://zhuanlan.zhihu.com/p/59327709
圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。
不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。
refresh方法中,操作共分13步:
- prepareRefresh(); 對刷新進行準備,包括設置開始時間,設置激活狀態,初始化Context中的佔位符,子類根據其需求執行具體準備工作,而後再由父類驗證必要參數
- obtianFreshBeanFactory(); 刷新並獲取內部的BeanFactory對象
- prepareBeanFactory(beanFactory); 對BeanFactory進行準備工作,包括設置類加載器和後置處理器,配置不能自動裝配的類型,註冊默認的環境Bean
- postProcessBeanFactory(beanFactory); 爲Context的子類提供後置處理BeanFactory的擴展能力,如想在bean定義加載完成後,開始初始化上下文之前進行邏輯操作,可重寫這個方法
- invokeBeanFactoryPostProcessors(beanFactory); 執行Context中註冊的BeanFactory後置處理器,有兩張處理器,一種是可以註冊Bean的後置處理器,一種的針對BeanFactory的後置處理器,執行順序是先按優先級執行註冊Bean的後置處理器,而後再按優先級執行鍼對BeanFactory的後置處理器SpringBoot中會進行註解Bean的解析,由ConfigurationClassPostProcessor觸發,由ClassPathDefinitionScanner解析,並註冊到BeanFactory
- registerBeanFactoryProcessor(beanFactory(); 按優先級順序在BeanFactory中註冊Bean的後置處理器,Bean處理器可在Bean的初始化前後處理
- initMessageSource();初始化消息源,消息源用於支持消息的國際化
- initApplicationEventMuticaster();初始化應用事件廣播器,用於向ApplicationListener通知各種應用產生的事件,標準的觀察者模型
- onRefresh(); 用於子類的擴展步驟,用於特定的Context子類初始化其他的Bean
- registerListeners(); 把實現了ApplicationListener的類註冊到廣播器,並對廣播其中早期沒有廣播的事件進行通知
- finishBeanFactoryInitialization(beanFactory); 凍結所有Bean描述信息的修改,實例化非延遲加載的單例Bean
- finishRefresh(); 完成上下文的刷新工作,調用LifecycleProcessor.onRefresh(),以及發佈ContextRefreshedEvent事件
- resetCommonCaches(); 在finally中執行該步驟,重置公共的緩存,如ReflectionUtils中的緩存,AnnotationUtils等
更詳細可見:SpringBoot源碼分析之Spring容器的refresh過程
Spring中bean的生命週期
第1步:調用bean的構造方法創建bean;
第2步:通過反射調用setter方法進行屬性的依賴注入;
第3步:如果實現BeanNameAware接口的話,會設置bean的name;
第4步:如果實現了BeanFactoryAware,會把bean factory設置給bean;
第5步:如果實現了ApplicationContextAware,會給bean設置ApplictionContext;
第6步:如果實現了BeanPostProcessor接口,則執行前置處理方法;
第7步:實現了InitializingBean接口的話,執行afterPropertiesSet方法;
第8步:執行自定義的init方法;
第9步:執行BeanPostProcessor接口的後置處理方法。
這時,就完成了bean的創建過程。
在使用完bean需要銷燬時,會先執行DisposableBean接口的destroy方法,然後在執行自定義的destroy方法。
Spring擴展接口
對spring進行定製化功能擴展時,可以選擇如下一些擴展點:
▌1.BeanFactoryPostProcessor
是beanFactory後置處理器,支持在bean factory標準初始化完成後,對bean factory進行一些額外處理。在講context初始化流程時介紹過,這時所有的bean的描述信息已經加載完畢,但是還沒有進行bean初始化。例如前面提到的PropertyPlaceholderConfigurer,就是在這個擴展點上對bean屬性中的佔位符進行替換。
▌2.BeanDefinitionRegistryPostProcessor
它擴展自BeanFactoryPostProcessor,在執行BeanFactoryPostProcessor的功能前,提供了可以添加bean definition的能力,允許在初始化一般bean前,註冊額外的bean。例如可以在這裏根據bean的scope創建一個新的代理bean。
▌3.BeanPostProcessor
提供了在bean初始化之前和之後插入自定義邏輯的能力。與BeanFactoryPostProcessor的區別是處理的對象不同,BeanFactoryPostProcessor是對beanfactory進行處理,BeanPostProcessor是對bean進行處理。
注:上面這三個擴展點,可以通過實現Ordered和PriorityOrdered接口來指定執行順序。實現PriorityOrdered接口的processor會先於實現Ordered接口的執行。
▌4.ApplicationContextAware
可以獲得ApplicationContext及其中的bean,當需要在代碼中動態獲取bean時,可以通過實現這個接口來實現。
▌5.InitializingBean
可以在bean初始化完成,所有屬性設置完成後執行特定邏輯,例如對自動裝配對屬性進行驗證等等。
▌6.DisposableBean
用於在bean被銷燬前執行特定的邏輯,例如做一些回收工作等。
▌7.ApplicationListener
用來監聽spring的標準應用事件或者自定義事件。