大話設(shè)計模式(二)代理模式">大話設(shè)計模式(二)代理模式
975
2022-05-30
問題起源
學(xué)習(xí)了Java的代理,動態(tài)代理,cglib的小伙伴對Java的代理中的一些概念應(yīng)該會有一些基礎(chǔ)的認(rèn)識,比如如何使用代理實現(xiàn)一個-,如果通過cglib的回調(diào)過濾器來修改方法的執(zhí)行邏輯等等,那么這種實現(xiàn)方式是否可以抽象為更高級的編程思想呢?使用cglib創(chuàng)建對象的過程與代碼很繁瑣,是否有更便捷的開源包可以使用呢?
AOP
AOP:面向切面編程,其思想是:
通過預(yù)編譯方式和運(yùn)行期動態(tài)代理方式,實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加額外功能的一種技術(shù)
我們今天要學(xué)習(xí)的AspectJ就是AOP思想的一個工具包,定義了AOP語法與基本概念。
AspectJ的一些基本概念
連接點:JoinPoint:
切入點:PointCut;
通知:Advice;
切面:Aspect。
其官方文檔釋義如下:
A join point is a well-defined point in the program flow. A pointcut picks out certain join points and values at those points. A piece of advice is code that is executed when a join point is reached. These are the dynamic parts of AspectJ.
其含義如下圖所示:
從實踐中學(xué)習(xí)
讓我們從實際代碼觸發(fā)來理解這幾個概念。
maven引入
使用aspectj需要我們引入以下兩個maven包:
第一個aspectjrt是aspectj運(yùn)行時需要的庫(Runtime Library),第二個aspectjweaver,支持切入點表達(dá)式,用于在加載Java類時起作用。
簡單使用
(在學(xué)習(xí)的過程中,有個東西始終讓我無法習(xí)慣,就是在java中引入.aj文件)
需要習(xí)慣這一點,在非spring項目中,使用aspectj可能需要修改maven文件與創(chuàng)建非.java文件。不過,現(xiàn)在的編譯器可以幫助我們習(xí)慣這一點,maven引入aspectj之后,IDEA便有了創(chuàng)建aspectj文件的選項:
最開始,我們有以下類:
package com.qw.real.aop; public class Person { /** * 讀書 * @return */ public boolean readBook(String book) { System.out.println("正在讀" + book); return true; } }
然后創(chuàng)建aspectj文件:
public aspect AjAspect { pointcut say(): execution(* App.say(..)); before(): say() { System.out.println("AjAspect before say"); } after(): say() { System.out.println("AjAspect after say"); } }
配置aspectj進(jìn)行編譯執(zhí)行
使用aspectj與其他java程序最大的不同是,需要特殊編譯環(huán)境,我們以idea為例,除需要在maven中引入之前的兩個aspectj運(yùn)行環(huán)境,還需要引入一個aspectj編譯器:
我們配置Java Compiler,測試:
這個錯誤似乎是在說我們的編譯環(huán)境與運(yùn)行環(huán)境所使用的版本不一致:編譯用version 55,而運(yùn)行使用的是 version 52,猜測可能是因為我們使用的最新的aspect包,為此,降低aspectj版本到1.8.3再次嘗試:
測試成功!
然后我們?nèi)?zhí)行:
before... 正在讀古文觀止 after...
總結(jié)
總的來看,aspectj非常強(qiáng)大,但是其需要特殊配置編譯環(huán)境這一點可能不太能被人接受。
Java Maven
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。