非侵入式AOP實踐(一) AspectJ

2021-10-06 06:06:47 字數 1705 閱讀 4106

aop,面向切面程式設計,可以不修改原來的**,增加一些通用的、業務無關的邏輯,例如日誌記錄效能統計等。但一般都是使用spring框架提供的aop支援和aspectj,需要先寫好切面邏輯,再在業務方法上加上設計好的註解:

/**

* 1.定義註解

*/ @target(elementtype.method)

@retention(retentionpolicy.runtime)

public @inte***ce nilogbefore

@aspect

public class nilogannotationaspect

/*** 3.定義切面:@before說明要在使用註解前就執行這個方法

*/@before("beforepointcut()")

public void before(joinpoint joinpoint)

}

/**

* 4.切面配置:啟用aspectj自動**

*/@configuration

@enableaspectjautoproxy

public class aspectjconfiguration

}

/**

* 5.在目標方法上使用註解

*/ @restcontroller

public class testcontroller

}

但是一旦不需要這個功能,這些沒用的註解就會造成**汙染。想象一下在乙個不能裝lombok外掛程式的ide裡發現了大量lombok註解是多麼痛苦。所以最好莫過於規避這些侵入**的註解。

aspectj是乙個很強大的面向切面框架,定義切點的時候,除了可以通過@pointcut("@annotation(com.null01.nonintrusivelog.annotation.nilogbefore)")指定註解為切點,還可以通過指示器中的execution()匹配連線點的執行方法:

/**

* 1.直接定義切面

*/ @aspect

public class nilogdesignatoraspect

}

/**

* 2.切面配置:啟用aspectj自動**

*/@configuration

@enableaspectjautoproxy

public class aspectjconfiguration

}

execution()指示器中直接指定目標方法,那麼目標方法上就不用再加自定義註解了。其中指示器中的是切點表示式:*表示返回任意型別,com.null01.nonintrusivelog.testcontroller.hhh是指定了包名類名的目標方法,..表示匹配任意引數。雖然切點表示式支援指定某個包某個類中的所有方法(*表示匹配任意字元),但不支援匹配多個切點,要是遇到切點比較分散的情況,就要定義多個切點方法,比較繁瑣。而且註解的引數一定要是編譯期常量,寫死在指示器上。這意味著配置切點的人一定要懂得切點表示式,而且不能通過設定解析配置檔案的方式儲存切點。

小小設想實踐,更詳細的**見:

侵入式和非侵入式的區別

簡單說一下我的理解吧。假設大家都想要把使用者 塞到乙個框架裡。侵入式的做法就是要求使用者 知道 框架的 表現為使用者 需要繼承框架提供的類。非侵入式則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如 使用struts的時候,我需要繼承一些struts的類,這時strut...

Spring 中侵入式與非侵入式的區別

假設大家都想要把使用者 塞到乙個框架裡。侵入式的做法就是要求使用者 知道 框架的 表現為使用者 需要繼承框架提供的類。非侵入式則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如 1 使用struts的時候,我需要繼承一些struts的類,這時struts侵入到了我的 裡...

侵入式框架和非侵入式框架的區別

開發程式的同時,引進的框架。如果在使用該框架時,要繼承框架提供的實體類或實現框架提供的介面,這就說明該框架是侵入式框架,因為程式本身對框架有了依賴,當去除框架時,程式也就無法執行,這個 也就是我們說的重量級框架,如struts1中,action和actionform必須要繼承action和actio...