Spring AOP

Spring AOP是代理模式的經(jīng)典實現(xiàn),代理模式的作用就是把一些目標類沒有的功能附加到代理類上,然后在代理類上執(zhí)行目標類的方法,這給客戶端的一個假象,好像這些新加功能在本來就在目標類上。Spring AOP使用的動態(tài)代理技術,JDK和CGLIB,Spring AOP優(yōu)先選擇JDK,假如不符合JDK代理的要求(目標類必須實現(xiàn)一個接口),就會嘗試使用CGLIB,如果再不符合CGLIB的要求(目標類不能是final類型),那么就不能使用Spring AOP技術。下面是一個基于XML配置的一個簡單但不是有用的例子。

  1. 目標類代碼
    public interface Mobile {
    public void call();
    }

     public class Xiaomi implements Mobile{
       @Override
       public void call() {
          System.out.println("小米手機打電話");
       }
     }
    
  2. 切面類代碼
    public class MobileAspect {
    //一個前置通知
    public void before(){
    System.out.println("開機");
    }
    }

  3. XML配置
    <bean id="xiaomi" class="annotation.Xiaomi"/>
    <bean id="aspect" class="annotation.MobileAspect"/>
    <aop:config>
    <aop:pointcut expression="execution(* annotation.Xiaomi.*(..))" id="pointcut"/>
    <aop:aspect ref="aspect">
    <aop:before method="before" pointcut-ref="pointcut"/>
    </aop:aspect>
    </aop:config>

  4. 測試類代碼:
    public class AopAnnotationDemo {
    public static void main(String[] args){
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-introduction.xml");
    Mobile mi = (Mobile) context.getBean("xiaomi");
    System.out.println(mi.getClass().getSimpleName());//輸出的是$Proxy2,說明我們調(diào)用不是Xiaomi類的對象,而是JDK動態(tài)代理生成的代理類,這個代理類在執(zhí)行Xiaomi類對象上的方法時,會想執(zhí)行切面類中的before()方法。
    mi.call();
    }
    }

Spring AOP也支持注解的方式。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容