Spring知識點

原文:https://www.cnblogs.com/lagou/p/10552815.html

一、spring基本概念

本文涉及的流程與實現默認都是基於最新的5.x版本。

 

spring中的幾個重要概念如下:

 

1.IOC

IOC,就是控制反轉,如最左邊,拿公司招聘崗位來舉例:

 

假設一個公司有產品、研發、測試等崗位。如果是公司根據崗位要求,逐個安排人選,如圖中向下的箭頭,這是正向流程。如果反過來,不用公司來安排候選人,而是由第三方獵頭來匹配崗位和候選人,然後進行推薦,如圖中向上的箭頭,這就是控制反轉。

 

在spring中,對象的屬性是由對象自己創建的,就是正向流程;如果屬性不是對象創建,而是由spring來自動進行裝配,就是控制反轉。這裏的DI也就是依賴注入,就是實現控制反轉的方式。正向流程導致了對象於對象之間的高耦合,IOC可以解決對象耦合的問題,有利於功能的複用,能夠使程序的結構變得非常靈活。

 

2.context上下文和bean

spring進行IOC實現時使用的有兩個概念:context上下文和bean。

 

如中間圖所示,所有被spring管理的、由spring創建的、用於依賴注入的對象,就叫做一個bean。Spring創建並完成依賴注入後,所有bean統一放在一個叫做context的上下文中進行管理。

 

3.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

 

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

 

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架(不會拿來考一般)

三、spring中機制和實現

 

1.AOP

AOP的實現是通過代理模式,在調用對象的某個方法時,執行插入的切面邏輯。實現的方式有動態代理也叫運行時增強,比如jdk代理、CGLIB;靜態代理是在編譯時進行織入或類加載時進行織入,比如AspectJ。

 

關於AOP還需要了解一下對應的Aspect、pointcut、advice等註解和具體使用方式。

 

2.placeHolder動態替換

主要需要了解替換髮生的時間,是在bean definition創建完成後,bean初始化之前,是通過實現BeanFactoryPostProcessor接口實現的。主要實現方式有PropertyPlaceholderConfigurer和PropertySourcesPlaceholderConfigurer。這兩個類實現邏輯不一樣,spring boot使用PropertySourcesPlaceholderConfigurer實現。

 

3.事務

需要了解spring 中對事務規定的隔離類型和事務傳播類型。要知道事務的隔離級別是由具體的數據庫來實現的,在數據庫部分我會詳細介紹。

 

事務的傳播類型,可以重點了解最常用的REQUIRED和SUPPORTS類型。

 

4.核心藉口類

  • ApplicationContext保存了ioc的整個應用上下文,可以通過其中的beanfactory獲取到任意到bean;

  • BeanFactory主要的作用是根據bean definition來創建具體的bean;

  • BeanWrapper是對Bean的包裝,一般情況下是在spring ioc內部使用,提供了訪問bean的屬性值、屬性編輯器註冊、類型轉換等功能,方便ioc容器用統一的方式來訪問bean的屬性;

  • FactoryBean通過getObject方法返回實際的bean對象,例如motan框架中referer對service的動態代理就是通過FactoryBean來實現的。

 

5.Scope

bean的scope是指bean的作用域,默認情況下是單例模式,這也是使用最多的一種方式;多例模式,即每次從beanFactory中獲取bean都會創建一個新的bean。

 

request、session、global-session是在web服務中使用的scope,request每次請求都創建一個實例,session是在一個會話週期內保證只有一個實例。

 

global-session在5.x版本中已經不在使用,同時增加了Application和Websocket兩種scope,分別保證在一個ServletContext與一個WebSocket中只創建一個實例。

 

6.事件機制

spring的事件機制需要知道spring定義的五種標準事件,具體事件可見上圖,瞭解如何自定義事件和實現對應的applicationListener來處理自定義事件。

 

四、Spring的Context的初始化流程

圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

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

第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動作根據子類的需求由子類來執行,然後驗證是否缺失必要的properties;

第2步:刷新並獲得內部的bean factory;

第3步:對bean factory進行準備工作,比如設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;

第4步:爲context的子類提供後置處理bean factory的擴展能力。如果子類想在bean定義加載完成後,開始初始化上下文之前做一些特殊邏輯,可以複寫這個方法;

第5步,執行context中註冊的bean factory後綴處理器;

注:這裏有兩種後置處理器,一種是可以註冊bean的後綴處理器,另一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。

對springboot來說,這一步會進行註解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到bean factory。

第6步:按優先級順序在beanfactory中註冊bean的後綴處理器,bean後置處理器可以在bean初始化前、後執行處理;

第7步:初始化消息源,消息源用來支持消息的國際化;

第8步:初始化應用事件廣播器。事件廣播器用來向applicationListener通知各種應用產生的事件,是一個標準的觀察者模式;

第9步,是留給子類的擴展步驟,用來讓特定的context子類初始化其他的bean;

第10步,把實現了ApplicationListener的bean註冊到事件廣播器,並對廣播器中的早期未廣播事件進行通知;

第11步,凍結所有bean描述信息的修改,實例化非延遲加載的單例bean;

第12步,完成上下文的刷新工作,調用LifecycleProcessor的onFresh()方法以及發佈ContextRefreshedEvent事件;

第13步:在finally中,執行第十三步,重置公共的緩存,比如ReflectionUtils中的緩存、AnnotationUtils中的緩存等等;

至此,spring的context初始化完成。這裏僅介紹了最主要的主流程,建議課後閱讀源碼來複習這個知識點,補全細節。

 

五:Spring中bean的生命週期

 

面試中經常問到的bean的生命週期,先看綠色的部分,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擴展  (比較少考吧)

七、springboot相關的知識點

 

1.啓動流程

主要步驟首先要配置environment,然後準備context上下文,包括執行applicationContext的後置處理、初始化initializer、通知listener處理contextPrepared和contextLoaded事件。最後執行refreshContext,也就是前面介紹過的AbstractApplicationContext類的refresh方法。

 

2.配置文件

然後要知道在Spring Boot中有兩種上下文,一種是bootstrap, 另外一種是application。

 

bootstrap是應用程序的父上下文,也就是說bootstrap會先於applicaton加載。bootstrap主要用於從額外的資源來加載配置信息,還可以在本地外部配置文件中解密屬性。bootstrap裏面的屬性會優先加載,默認也不能被本地相同配置覆蓋。

 

3.註解

@SpringBootApplication包含了@ComponentScan、@EnableAutoConfiguration、@SpringBootConfiguration三個註解

 

而@SpringBootConfiguration註解包含了@Configuration註解。也就是springboot的自動配置功能。

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