Spring框架學(xué)習(xí)二(AOP核心知識)

3.1. 代理模式

3.1.1. 靜態(tài)代理

靜態(tài)代理角色分析

  • 抽象角色 : 一般使用接口或者抽象類來實(shí)現(xiàn)

  • 真實(shí)角色 : 被代理的角色

  • 代理角色 : 代理真實(shí)角色 ; 代理真實(shí)角色后 , 一般會做一些附屬的操作 .

  • 客戶 : 使用代理角色來進(jìn)行一些操作 .

舉個實(shí)際中的例子:租客通過房產(chǎn)中介進(jìn)行租房的活動疚脐。對應(yīng)到上面的角色分析,租房行為對應(yīng)抽象角色代态,真實(shí)角色對應(yīng)房東蟀俊,代理角色對應(yīng)中介鸵贬,租客對應(yīng)客戶嘀趟。

public interface Rent {
 void rent();
}
?
public class Host implements Rent{
 @Override
 public void rent() {
 System.out.println("I hava a room to rent");
 }
}
?
public class RentProxy implements Rent{
 private Host host;
?
 public RentProxy() {
 }
?
 public RentProxy(Host host) {
 this.host = host;
 }
?
 @Override
 public void rent() {
 host.rent();
 sign();
 }
?
 // 代理類的附加行為
 public void sign(){
 System.out.println("I can sign a contract");
 }
}
?
public class consumer {
 public static void main(String[] args) {
 RentProxy rentProxy = new RentProxy(new Host());
 rentProxy.rent();
 }
}

優(yōu)點(diǎn):可以對已有的功能進(jìn)行增強(qiáng)而不用對已有代碼進(jìn)行改動

缺點(diǎn):增大代碼量嚷狞,每一個需要代理的類都必須要用一個代理類

結(jié)合上如問題雄驹,引申出動態(tài)代理的實(shí)現(xiàn)方法。

3.1.2. 動態(tài)代理

  • 動態(tài)代理的角色和靜態(tài)代理的一樣 .

  • 動態(tài)代理的代理類是動態(tài)生成的 . 靜態(tài)代理的代理類是我們提前寫好的

  • 動態(tài)代理分為兩類 : 一類是基于接口動態(tài)代理 , 一類是基于類的動態(tài)代理

    • 基于接口的動態(tài)代理----JDK動態(tài)代理

    • 基于類的動態(tài)代理--cglib

    • 現(xiàn)在用的比較多的是 javasist 來生成動態(tài)代理

3.1.2.1. JDK動態(tài)代理

核心 : InvocationHandlerProxy

public class ProxyInvocationHandler implements InvocationHandler {
 private Rent rent;
?
 public void setRent(Rent rent) {
 this.rent = rent;
 }
?
 public Object getProxy() {
 return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
 }
?
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 Object result = method.invoke(rent, args);
 return result;
 }
}

一個動態(tài)代理 , 一般代理某一類業(yè)務(wù)

3.1.2.2. CGLIB動態(tài)代理

核心:MethodInterceptor和Enhancer

public class CglibProxy implements MethodInterceptor {
 @Override
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
 System.out.println("這里是對目標(biāo)類進(jìn)行增強(qiáng)Q痛恰R接摺!");
 Object result = methodProxy.invokeSuper(o, objects);
 return result;
 }
}
public class Client {
 public static void main(String[] args) {
 //創(chuàng)建Enhancer對象象缀,類似于JDK動態(tài)代理的Proxy類蔬将,下一步就是設(shè)置幾個參數(shù)
 Enhancer enhancer = new Enhancer();
 //設(shè)置目標(biāo)類的字節(jié)碼文件
 enhancer.setSuperclass(Dog.class);
 //設(shè)置回調(diào)函數(shù)
 enhancer.setCallback(new CglibProxy());
 //這里的creat方法就是正式創(chuàng)建代理類
 Dog dogProxy = (Dog)enhancer.create();
 //調(diào)用代理類的shout方法
 dogProxy.shout();
 }
}

3.1.3. AOP

AOP(Aspect Oriented Programming)意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)央星。

3.1.3.1. 核心概念
  • 橫切關(guān)注點(diǎn):跨越應(yīng)用程序多個模塊的方法或功能霞怀。即是,與我們業(yè)務(wù)邏輯無關(guān)的莉给,但是我們需要關(guān)注的部分毙石,就是橫切關(guān)注點(diǎn)。如日志 , 安全 , 緩存 , 事務(wù)等等 ....

  • 切面(ASPECT):橫切關(guān)注點(diǎn) 被模塊化 的特殊對象颓遏。即徐矩,它是一個類。

  • 通知(Advice):切面必須要完成的工作叁幢。即滤灯,它是類中的一個方法。

  • 目標(biāo)(Target):被通知對象。

  • 代理(Proxy):向目標(biāo)對象應(yīng)用通知之后創(chuàng)建的對象鳞骤。

  • 切入點(diǎn)(PointCut):切面通知執(zhí)行的 “地點(diǎn)”的定義窒百。

  • 連接點(diǎn)(JointPoint):與切入點(diǎn)匹配的執(zhí)行點(diǎn)。

1570025468277.png

SpringAOP中豫尽,通過Advice定義橫切邏輯篙梢,Spring中支持5種類型的Advice:

1570025522824.png
3.1.3.2. 案例說明
public interface UserService {
 void add();
 void delete();
 void update();
 void select();
}
public class UserServiceImpl implements UserService {
 @Override
 public void add() {
 System.out.println("ADD方法執(zhí)行");
 }
?
 @Override
 public void delete() {
 System.out.println("DELETE方法執(zhí)行");
 }
?
 @Override
 public void update() {
 System.out.println("UPDATE方法執(zhí)行");
 }
?
 @Override
 public void select() {
 System.out.println("SELECT方法執(zhí)行");
 }
}
// AOP增強(qiáng)類
public class Log implements MethodBeforeAdvice {
 @Override
 public void before(Method method, Object[] args, Object target) throws Throwable {
 System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被執(zhí)行了");
 }
}
?
public class Client {
 public static void main(String[] args) {
 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
 UserService userService = context.getBean("userService",UserService.class);
 userService.add();
 }
}

其他說明:

<aop:aspectj-autoproxy />

有一個proxy-target-class屬性,默認(rèn)為false拂募,表示使用jdk動態(tài)代理織入增強(qiáng)庭猩,當(dāng)配為<aop:aspectj-autoproxy poxy-target-class="true"/>時,表示使用CGLib動態(tài)代理技術(shù)織入增強(qiáng)陈症。不過即使proxy-target-class設(shè)置為false蔼水,如果目標(biāo)類沒有聲明接口,則spring將自動使用CGLib動態(tài)代理录肯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴腋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子论咏,更是在濱河造成了極大的恐慌优炬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厅贪,死亡現(xiàn)場離奇詭異蠢护,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)养涮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門葵硕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贯吓,你說我怎么就攤上這事懈凹。” “怎么了悄谐?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵介评,是天一觀的道長。 經(jīng)常有香客問我爬舰,道長们陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任洼专,我火速辦了婚禮棒掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屁商。我一直安慰自己烟很,他們只是感情好颈墅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雾袱,像睡著了一般恤筛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芹橡,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天毒坛,我揣著相機(jī)與錄音,去河邊找鬼林说。 笑死煎殷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腿箩。 我是一名探鬼主播豪直,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼珠移!你這毒婦竟也來了弓乙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钧惧,失蹤者是張志新(化名)和其女友劉穎暇韧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浓瞪,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懈玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乾颁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪刀。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钮孵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眼滤,我是刑警寧澤巴席,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站诅需,受9級特大地震影響漾唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堰塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一赵刑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧场刑,春花似錦般此、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邀桑。三九已至,卻和暖如春科乎,著一層夾襖步出監(jiān)牢的瞬間壁畸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工茅茂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏萍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓空闲,卻偏偏與公主長得像令杈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子进副,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容