spring基礎知識

2021-10-03 11:14:18 字數 2810 閱讀 4070

通知(advice)

通知定義了要織入目標物件的邏輯,以及執行時機。

spring 中對應了 5 種不同型別的通知:

· 前置通知(before):在目標方法執行前,執行通知

· 後置通知(after):在目標方法執行後,執行通知,此時不關係目標方法返回的結果是什麼

· 返回通知(after-returning):在目標方法執行後,執行通知

· 異常通知(after-throwing):在目標方法丟擲異常後執行通知

· 環繞通知(around): 目標方法被通知包裹,通知在目標方法執行前和執行後都被會呼叫

切點(pointcut)

切點的作用就是

通過匹配規則查詢合適的連線點(joinpoint),aop 會在這些連線點上織入通知。

切面(aspect)

切面包含了通知和切點

spring 中 aop 的實現步驟

aop 邏輯介入 beanfactory 例項化 bean 的過程

根據 pointcut 定義的匹配規則,判斷當前正在例項化的 bean 是否符合規則

如果符合,**生成器將切面邏輯 advice 織入 bean 相關方法中,並為目標 bean 生成**物件

將生成的 bean 的**物件返回給 beanfactory 容器,到此,aop 邏輯執行結束。

beanfactory 的生命流程

beanfactory 載入 bean 配置檔案,將讀到的 bean 配置封裝成 beandefinition 物件

將封裝好的 beandefinition 物件註冊到 beandefinition 容器中

註冊 beanpostprocessor 相關實現類到 beanpostprocessor 容器中

beanfactory 進入就緒狀態

外部呼叫 beanfactory 的 getbean(string name) 方法,beanfactory 著手例項化相應的 bean

重複步驟 3 和 4,直至程式退出,beanfactory 被銷毀。

**beandefinition:**根據 bean 配置資訊生成相應的 bean 詳情物件。beanreference 物件儲存的是 bean 配置中 ref 屬性對應的值,在後續 beanfactory 例項化 bean 時,會根據 beanreference 儲存的值去例項化 bean 所依賴的其他 bean。

xmlbeandefinitionreader :

將 xml 配置檔案載入到記憶體中

獲取根標籤下所有的標籤

遍歷獲取到的標籤列表,並從標籤中讀取 id,class 屬性

建立 beandefinition 物件,並將剛剛讀取到的 id,class 屬性值儲存到物件中

遍歷標籤下的標籤,從中讀取屬性值,並保持在 beandefinition 物件中

將 鍵值對快取在 map 中,留作後用

重複3、4、5、6步,直至解析結束。

beanpostprocessor 介面

通過實現這個介面,我們就可在 bean 例項化時,對bean 進行一些處理。比如,我們所熟悉的 aop 就是在這裡將切面邏輯織入相關 bean 中的。正是因為有了 beanpostprocessor 介面作為橋梁,才使得 aop 可以和 ioc 容器產生聯絡。

xmlbeandefinitionreader 在完成解析工作後,beanfactory 會將它解析得到的 鍵值對註冊到自己的 beandefinitionmap 中。beanfactory 註冊好 beandefinition 後,就立即開始註冊 beanpostprocessor 相關實現類。這個過程比較簡單:

根據 beandefinition 記錄的資訊,尋找所有實現了 beanpostprocessor 介面的類。

例項化 beanpostprocessor 介面的實現類

將例項化好的物件放入 list中

重複2、3步,直至所有的實現類完成註冊。

getbean 過程解析

getbean(string name) 方法來獲取容器中的 bean

spring 中的 bean 的作用域有哪些?

singleton : 唯一 bean 例項,spring 中的 bean 預設都是單例的。

prototype : 每次請求都會建立乙個新的 bean 例項。

request : 每一次http請求都會產生乙個新的bean,該bean僅在當前http request內有效。

session : 每一次http請求都會產生乙個新的 bean,該bean僅在當前 http session 內有效。

@component 和 @bean 的區別是什麼?

作用物件不同: @component 註解作用於類,而@bean註解作用於方法。

@component通常是通過類路徑掃瞄來自動偵測以及自動裝配到spring容器中(我們可以使用 @componentscan 註解定義要掃瞄的路徑從中找出標識了需要裝配的類自動裝配到 spring 的 bean 容器中)。@bean 註解通常是我們在標有該註解的方法中定義產生這個 bean,@bean告訴了spring這是某個類的示例,當我需要用它的時候還給我。

@bean 註解比 component 註解的自定義性更強,而且很多地方我們只能通過 @bean 註解來註冊bean。比如當我們引用第三方庫中的類需要裝配到 spring容器時,則只能通過 @bean來實現。

spring基礎知識詳解

spring注入方式 xml配置注入 xml注入分為 構造方法注入 和setter方法注入 配置如下 使用p命名空間注入 詳情可參考spring spel表示式 簡化setter方法注入 setter方法注入 p命令空間 普通值 p 屬性名 值 引用值 p 屬性名 ref 引用名稱 前提 必須新增p...

Spring基礎知識梳理

1 spring概要 spring現在主要是一站式服務,spring core container是 其中最重要的元件,一般與其他框架一起用。spring容器最重要的作用?是管理bean,spring容器中的全部物件都是bean。spring通過什麼來管理bean?xml檔案 spring的底層會執...

Spring基礎知識(一)

bean管理物件的xml檔案配置 1 ioc invension of control 即控制反轉,是spring的核心內容。在沒有使用spring的時候,程式中物件的建立時通過new來實現的,需要自己根據需要建立物件。而在spring中,我們把物件建立的控制權交給ioc容器,在需要物件的時候,io...