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...