AOP學習心得&jdk動態代理與cglib比較


什么是AOP

AOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對於其他類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用。

   

AOP使用場景

AOP用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限

Caching 緩存

Context passing 內容傳遞

Error handling 錯誤處理

Lazy loading 懶加載

Debugging  調試

logging, tracing, profiling and monitoring 記錄跟蹤 優化 校准

Persistence  持久化。。。等

jdk動態代理與cglib比較

   jdk的動態代理是基於類實現了接口,cglib是基於類,沒有強制要求目標類一定要是實現接口。

   jdk的核心是實現InvocationHandler接口,使用invoke()方法進行面向切面的處理,調用相應的通知。

   cglib的核心是實現MethodInterceptor接口,使用intercept()方法進行面向切面的處理,調用相應的通知。

   其中cglib中有一個Enhancer類,可以使用他快速的創建一個代理類。

  例如:

@Test
public void testEnhancer() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Print.class);//代理目標類
//回調函數--執行目標類的方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("intercept begin...");
return proxy.invokeSuper(obj,args);
}
});
Print print = (Print) enhancer.create();
print.doPrint("打印機");
}
通過設置目標類和回調函數后調create()方法就可以創建一個代理類處理,簡單粗暴。。嘿嘿。。

aop簡單的學習demo

配置spring文件中加入:

<bean id="aopAdvisor" class="com.springapp.utils.AopAdvisor"/>
<aop:config expose-proxy="false" proxy-target-class="false">
<!-- 定義切面 -->
<aop:aspect ref="aopAdvisor">
<!-- 定義切入點 -->
<aop:pointcut id="teacherService" expression="execution(* com.springapp.service.*.*(..))" />
<!-- 定義前置 -->
<aop:before method="before" pointcut-ref="teacherService"/>
<!-- 引入 -->
<aop:declare-parents types-matching="com.springapp..*.TeacherService+" implement-interface="com.springapp.service.AopParentService"
default-impl="com.springapp.service.impl.AopParentServiceImpl"/>
<!-- 定義后置 -->
<aop:after method="after" pointcut-ref="teacherService"/>
<!-- 環繞通知 -->
<aop:around method="doAround" pointcut-ref="teacherService"/>
</aop:aspect>
</aop:config>

@Slf4j
public class AopAdvisor {
public void before(JoinPoint point) {
System.out.println("AopAdvisor類的before(),目標方法是:"+point);
}
public void after(JoinPoint point) {
System.out.println("AopAdvisor類after(),目標方法是:"+point);
}
public Object doAround(ProceedingJoinPoint point) throws Throwable {
System.out.println("AopAdvisor類的doAround(),目標方法是:"+point);
return point.proceed();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM