spring 各大重點 總結

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

  1. singleton默認情況下是單例模式,這也是使用最多的一種方式;
  2. prototype多例模式,即每次從beanFactory中獲取bean都會創建一個新的bean。
  3. request每次請求都創建一個實例,
  4. session是在一個會話週期內保證只有一個實例。
  5. global-session在5.x版本中已經不在使用,
  6. Application保證在一個ServletContext中只創建一個實例。
  7. Websocket保證在一個WebSocket中只創建一個實例。

4大核心接口/類

  1. ApplicationContext保存了ioc的整個應用上下文,可以通過其中的beanfactory獲取到任意到bean;
  2. BeanFactory主要的作用是根據bean definition來創建具體的bean;
  3. BeanWrapper是對Bean的包裝,一般情況下是在spring ioc內部使用,提供了訪問bean的屬性值、屬性編輯器註冊、類型轉換等功能,方便ioc容器用統一的方式來訪問bean的屬性;
  4. FactoryBean通過getObject方法返回實際的bean對象,例如motan框架中referer對service的動態代理就是通過FactoryBean來實現的。

7大事務傳播類型

  1. PROPAGATION_REQUIRED 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。【默認】
  2. PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
  3. PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
  4. PROPAGATION_REQUIRES_NEW 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
  5. PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。
  6. PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
  7. PROPAGATION_NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

5大隔離級別

  1. ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應【默認】
  2. ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀【隔離級別最低,併發性能高 】
  3. ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。【鎖定正在讀取的行】
  4. ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。【鎖定所讀取的所有行】
  5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。【鎖表】

 

Spring Context初始化流程

 

https://zhuanlan.zhihu.com/p/59327709

  圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。

  不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

  refresh方法中,操作共分13步:

  1. prepareRefresh(); 對刷新進行準備,包括設置開始時間,設置激活狀態,初始化Context中的佔位符,子類根據其需求執行具體準備工作,而後再由父類驗證必要參數
  2. obtianFreshBeanFactory(); 刷新並獲取內部的BeanFactory對象
  3. prepareBeanFactory(beanFactory); 對BeanFactory進行準備工作,包括設置類加載器和後置處理器,配置不能自動裝配的類型,註冊默認的環境Bean
  4. postProcessBeanFactory(beanFactory); 爲Context的子類提供後置處理BeanFactory的擴展能力,如想在bean定義加載完成後,開始初始化上下文之前進行邏輯操作,可重寫這個方法
  5. invokeBeanFactoryPostProcessors(beanFactory); 執行Context中註冊的BeanFactory後置處理器,有兩張處理器,一種是可以註冊Bean的後置處理器,一種的針對BeanFactory的後置處理器,執行順序是先按優先級執行註冊Bean的後置處理器,而後再按優先級執行鍼對BeanFactory的後置處理器SpringBoot中會進行註解Bean的解析,由ConfigurationClassPostProcessor觸發,由ClassPathDefinitionScanner解析,並註冊到BeanFactory
  6. registerBeanFactoryProcessor(beanFactory(); 按優先級順序在BeanFactory中註冊Bean的後置處理器,Bean處理器可在Bean的初始化前後處理
  7. initMessageSource();初始化消息源,消息源用於支持消息的國際化
  8. initApplicationEventMuticaster();初始化應用事件廣播器,用於向ApplicationListener通知各種應用產生的事件,標準的觀察者模型
  9. onRefresh(); 用於子類的擴展步驟,用於特定的Context子類初始化其他的Bean
  10. registerListeners(); 把實現了ApplicationListener的類註冊到廣播器,並對廣播其中早期沒有廣播的事件進行通知
  11. finishBeanFactoryInitialization(beanFactory); 凍結所有Bean描述信息的修改,實例化非延遲加載的單例Bean
  12. finishRefresh(); 完成上下文的刷新工作,調用LifecycleProcessor.onRefresh(),以及發佈ContextRefreshedEvent事件
  13. resetCommonCaches(); 在finally中執行該步驟,重置公共的緩存,如ReflectionUtils中的緩存,AnnotationUtils等

   更詳細可見:SpringBoot源碼分析之Spring容器的refresh過程

Spring中bean的生命週期

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的標準應用事件或者自定義事件。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章