在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ Spring aop的通知名稱的問題?

Spring aop的通知名稱的問題?

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
后置通知:AfterReturningAdviceAfterAdvice也只是繼承了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為前綴,例如AspectJMethodBeforeAdviceAspectJExpressionPointcutAdvisor(注意,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>
``
2018年1月21日 15:20
編輯回答
耍太極

這兩種并不都是通知
以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功能

2017年6月11日 17:57