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)。