Spring AOP攔截器通知的名字如下:
MethodBeforeAdviceInterceptor (前置通知)
AspectJAfterThrowingAdvice (異常后通知)
AspectJAfterAdvice (最終通知)
AfterReturningAdviceInterceptor (后置通知)
請問大家,為什么有的以Interceptor結(jié)尾,而另一些以Advice結(jié)尾?
樓上說的也不準確,這還是要從AOP聯(lián)盟和規(guī)范說起,你可在spring-aop包下看到,兩塊東西,其中一塊就是aop規(guī)范的接口,Rod Johnson只是把它集成了,沒有打算重寫和修改規(guī)范的意圖,而其中除了一個Advice頂級接口和一個AdiceException剩下的主要以Interceptor結(jié)尾
spring aop其中部分通知接口繼承了Advice接口但是自己又重新定義了,例如:org.springframework.aop.BeforeAdvice
而部分則采用aop規(guī)范的接口,例如:org.aopalliance.intercept.MethodInterceptor
更新(2018-09-01):
我就再說多一點,首先不是所有通知都實現(xiàn)了MethodInterceptor(環(huán)繞通知)
前置通知:MethodBeforeAdvice、BeforeAdvice只是繼承了Advice
后置通知:AfterReturningAdvice、AfterAdvice也只是繼承了Advice
異常通知:ThrowsAdvice繼承了AfterAdvice,也是一種后置通知
引介通知:IntroductionInterceptor才是繼承了MethodInterceptor
從以上來看,命名還是很規(guī)范的,對吧,主要以advice為后綴
好了,再說Aspctj,織入是將增強添加到目標類的具體連接點上的過程。根據(jù)不同的實現(xiàn)技術(shù),AOP有3種織入方式。
(1)編譯期織入,這要求使用特殊的Java編譯器。
(2)類裝載期織入,這要求使用特殊的類裝載器。
(3)動態(tài)代理織入,在運行期為目標類添加增強生成子類的方式。
Spring采用動態(tài)代理織入,而AspectJ采用編譯期織入和類裝載期織入。
Spring AOP無意將Aspectj拒之門外,而是采取了兼收并蓄的方式,即繼承了Aspectj的表達式語法來定義切點和增強(你可以簡單理解為通知),所以一般要用AOP的話除了引入spring-aop.jar的包還會引用aspecj.weaver.jar(或者aspect.tools.jar,后者包含前者)來引入語法相關(guān)的工具(一些注解和接口,例如@Before),一般我們有若干方式來啟用Aspectj,但主要就是注解和配置兩種,當然了,對應到容器中主要還是實體類,而這些類主要以Aspectj為前綴,例如AspectJMethodBeforeAdvice和AspectJExpressionPointcutAdvisor(注意,Advisor不用于Advice)
/**
* 注解
*/
@Aspect
@Component
public class UserAdvice {
@Before("execution(* *UserByName(..))")
public void before() {
System.err.println("before...");
}
}
/**
* xml配置
*/
<aop:config>
<aop:aspect ref="**">
<aop:before pointcut="execution(* *UserByName(..))" method="**">
</aop:aspect>
</aop:config>
``這兩種并不都是通知
以Interceptor結(jié)尾的類主要是org.aopalliance.intercept.MethodInterceptor接口的實現(xiàn)類,在MethodBeforeAdviceInterceptor 源碼中可以看到:
/**
* Interceptor to wrap am {@link org.springframework.aop.MethodBeforeAdvice}.
* Used internally by the AOP framework; application developers should not need
* to use this class directly.
*
* @author Rod Johnson
*/
@SuppressWarnings("serial")
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {
private MethodBeforeAdvice advice;
...
}
可以看到在MethodBeforeAdviceInterceptor 中就包含了一個MethodBeforeAdvice ,并且在注釋里坐著建議不要直接使用這個類
因為這一種'Interceptor'用于生成代理對象,即實際上通過cglib生成的代理類,就是這貨。
而MethodBeforeAdvice 這類'advice'才是你所說的通知,一些操作比如切面判斷,執(zhí)行對應的代理方法等操作就是在里面實現(xiàn)的。
之前我正好有寫到模擬實現(xiàn)spring的AOP的功能,你感興趣可以看看:
實現(xiàn)AOP
引入aspectj實現(xiàn)AOP切點
加強AOP功能
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。