spring學(xué)習(xí)筆記(楠哥視頻)

spring

spring 框架兩大核心機(jī)制(ioc 和aop)

  • ioc(控制反轉(zhuǎn)/依賴注入)

  • aop(面向切面編程)

    可以將應(yīng)用程序分層,開發(fā)者可以自主選擇組件

    mvc:struts2,springmvc

    ormapping:hibernate,mybatis,spring data

    如何使用xml配置文件實(shí)現(xiàn)

  • 通過配置bean標(biāo)簽完成與對象的管理

    • id:對象名

    • class:對象模板類(所有交給ioc容器管理的類必須有無參構(gòu)造函數(shù),因?yàn)閟pring底層使用反射創(chuàng)建對象的調(diào)用的是無參構(gòu)造。)

    • name:成員變量名

    • value:成員變量值(基本類型,string可以直接賦值,如果是其他類型,不能通過value賦值)

    • ref:將ioc中另一個bean賦給當(dāng)前成員變量(DI)

    Ioc底層原理

    • 讀取配置文件,解析xml

    • 通過反射機(jī)制實(shí)例化配置文件配置的所有bean

    通過運(yùn)行時類獲取bean

    存在一個問題,配置文件一種類型的對象只能有一個實(shí)例,否則會拋出異常,因?yàn)闆]有唯一的bean。

    通過有參構(gòu)造創(chuàng)建bean

    • 實(shí)體類中創(chuàng)建有參構(gòu)造函數(shù)

    • 配置文件 配置constructor-arg標(biāo)簽

    給bean注入集合

    使用list與ref配置集合。

    scope作用域

    spring 管理bean是根據(jù)scope來生成的,表示bean的作用域,共四種,默認(rèn)singleton。

    • singleton :單例,表示通過ioc獲取的bean是唯一的。
    • prototype:原型,表示通過ioc獲取的bean是不同的。
    • request:請求,表示在一次請求中有效。
    • session:會話,表示在一次會話中有效。

    注意:request與session只適用于web項(xiàng)目中,大多數(shù)情況下單例與原型使用的多。

    prototype模式當(dāng)業(yè)務(wù)代碼獲取ioc中bean的時候,spring才會調(diào)用無參構(gòu)造函數(shù)創(chuàng)建bean進(jìn)行使用。

    singleton模式是在加載spring.xml中就會創(chuàng)建bean。無論業(yè)務(wù)代碼是否獲取ioc容器中的bean。

    spring的繼承

    java 類層面的繼承,spring是對象之間的繼承,子對象繼承父對象的屬性值。

    spring繼承的關(guān)注點(diǎn)在具體的對象,而不在于類,即不同的兩個類的實(shí)例化對象可以完成繼承,前提是子對象必須包含父對象的所有屬性,同時可以在基礎(chǔ)上添加其他屬性。

    spring的依賴

    依賴是描述bean與bean之間的一種關(guān)系,配置依賴后,被依賴的bean一定先被加載,在創(chuàng)建依賴的bean

    spring 中p命名空間

    p命名空間是對ioc與DI的簡化操作,p命名空間可以很快的完成bean的配置,以及bean之間的依賴注入。

    spring的工廠方法

    ioc通過工廠模式創(chuàng)建bean的方式有兩種:

    • 靜態(tài)工廠方法(一個實(shí)例化對象就可以)
    • 實(shí)例工廠方法(兩個實(shí)例化對象)

ioc自動從裝載

ioc負(fù)責(zé)創(chuàng)建對象,DI完成依賴注入,通過property中ref標(biāo)簽屬性完成,spring提供了一種更為簡單的依賴注入:自動裝載,ioc自動選擇bean完成注入。

兩種方式:

  • byName :通過屬性名自動裝載
  • byType:通過屬性的類型自動裝載(如出現(xiàn)兩個相同類型的bean會拋出異常)

AOP

Aspect Oriented Programming

優(yōu)點(diǎn):

  • 降低模塊之間的耦合

  • 使系統(tǒng)更容易擴(kuò)展

  • 更好的代碼復(fù)用

  • 非業(yè)務(wù)代碼更加集中,不分散,便于統(tǒng)一管理

  • 業(yè)務(wù)代碼更加簡潔,不摻雜其他代碼的影響。

    aop是面向?qū)ο缶幊痰囊粋€補(bǔ)充,運(yùn)行的時候,動態(tài)的將代碼切入到類的指定方法,指定位置進(jìn)行編程思想就是面向切面的編程,將不同方法的同一位置抽象成一個切面對象,對該切面對象的編程就是aop。

底層是動態(tài)代理

  • 創(chuàng)建代理對象生成類實(shí)現(xiàn)IvocationHandler接口

  • 傳入委托對象

  • 返回代理對象

  • 在invoke方法中寫非業(yè)務(wù)邏輯,其中調(diào)用委托對象方法,實(shí)現(xiàn)動態(tài)代理。

spring框架不需要創(chuàng)建InvocationHandler,只需要 創(chuàng)建一個切面對象,將所有非業(yè)務(wù)代碼在切面對象中完成,spring框架會自動根據(jù)切面類以及目標(biāo)類生成一個代理對象。

切面對象類添加注解:

  • @Aspect :表示該類為切面類

  • @component :表示該類對象注入到容器中

具體方法添加注解

  • @before :方法執(zhí)行的具體位置與時機(jī)

  • 業(yè)務(wù)類也要通過@component放到ioc容器中

注意:

context:component-scan配置包掃描(掃描注解,到ioc)

aop:aspectj-autoproxy,讓spring框架結(jié)合切面類自動生成動態(tài)代理對象。

  • 切面:橫切關(guān)注點(diǎn)被模塊化的抽象對象。

  • 通知:切面對象完成工作。

  • 目標(biāo):被通知對象,即被橫切對象

  • 代理:切面、目標(biāo)、通知混合之后的對象。

  • 連接點(diǎn):通知要插入業(yè)務(wù)代碼的具體位置

  • 切點(diǎn):aop通過切點(diǎn)定位到連接點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容