日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

AOP的两种实现方式

發布時間:2025/6/15 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AOP的两种实现方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AOP,面向切面編程,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。??
? Aspect Oriented Programming(AOP),是目前軟件開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
? 有兩種方式可以實現aop,一種是根據利用jdk自帶的proxy,另外一種是利用cglib的proxy.
? 一 jdk代理
??? JDK的動態代理主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler。其中 InvocationHandler是一個接口,可以通過實現該接口定義橫切邏輯,在并通過反射機制調用目標類的代碼,動態將橫切邏輯和業務邏輯編織在一起。
自定義一個接口
public interface TestInterface {
??? public void insert();

}
實現接口
public class TestImpl implements TestInterface{

??? @Override
??? public void insert() {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("插入數據");
??? ????
??? }

}

創建jdk動態代理的工廠類
public class JdkDymanicProxyFactory implements InvocationHandler{
????
??? private Object targetObject;
??? public Object createProxyFactory(Object target){
??? ??? this.targetObject = target;
??? ??? return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
??? }

??? //執行方法的時候回去回調這個函數
??? public Object invoke(Object proxy, Method method, Object[] args)
??? ??? ??? throws Throwable {
??? ??? // TODO Auto-generated method stub
??? ??? //在這里做一下日記
??? ??? System.out.println("execute:"+method.getName());
??? ??? return method.invoke(targetObject, args);
??? }

}

測試執行結果
package com.lwq;
/**
?* @author thomaslwq?
?* @version 創建時間:Sep 17, 2012 8:56:20 AM
?* 類說明 利用jdk的動態代理實現aop
?*/


public class JdkProxyTest {
????
??? public static void main(String args[]){
??? ????
??? ??? JdkDymanicProxyFactory jdpf = new JdkDymanicProxyFactory();
??? ??? TestInterface ti = (TestInterface) jdpf.createProxyFactory(new TestImpl());
??? ??? ti.insert();
??? }

}
運行結果如下:
execute:insert
插入數據

二 利用cglib代理實現aop

CGlib是一個強大的,高性能,高質量的Code生成類庫。它可以在運行期擴展Java類與實現Java接口。? CGLIB是針對類實現代理的,主要對指定的類生成一個子類,并覆蓋其中的方法, 因為是繼承,所以不能使用final來修飾類或方法 。和jdk代理實現不同的是,cglib不要求類實現接口。
即你可以直接編出一個類:
public class CglibTestImpl {
??? public void insert() {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("插入數據");
??? ????
??? }

}
然后創建cglib代理的工廠類:
package com.lwq;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
?* @author thomaslwq?
?* @version 創建時間:Sep 17, 2012 9:24:23 AM
?* 類說明
?*/
public class CglibProxyFactory implements MethodInterceptor{
????
??? private Object targetObject;
??? public Object createProxyInstance(Object target){
??? ??? this.targetObject = target;
??? ??? Enhancer enhancer = new Enhancer();
??? ??? enhancer.setSuperclass(this.targetObject.getClass());
??? ??? //設置回調函數
??? ??? enhancer.setCallback(this);
??? ??? return enhancer.create();
??? ????
??? }

??? @Override
??? public Object intercept(Object obj, Method method, Object[] args,
??? ??? ??? MethodProxy proxy) throws Throwable {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("record:"+method.getName());
??? ??? System.out.println("Object:"+obj.getClass());
??? ??? System.out.println("targetObject:"+targetObject.getClass());
??? ??? return method.invoke(targetObject, args);
??? }

}
最后寫一個測試類:
package com.lwq;
/**
?* @author thomaslwq?
?* @version 創建時間:Sep 17, 2012 9:29:21 AM
?* 類說明
?*/
public class CglibProxyTest {

??? /**
??? ?* @param args
??? ?*/
??? public static void main(String[] args) {
??? ??? // TODO Auto-generated method stub
??? ??? CglibProxyFactory cpf = new CglibProxyFactory();
??? ??? //沒有實現接口
??? ??? CglibTestImpl ti = (CglibTestImpl)cpf.createProxyInstance(new CglibTestImpl());
??? ??? ti.insert();
??? }

}
測試結果如下:
record:insert
插入數據


JDK動態代理和CGLIB字節碼生成的區別??
* JDK動態代理只能對實現了接口的類生成代理,而不能針對類?
* CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法?
? 因為是繼承,所以該類或方法最好不要聲明成final?

總結

以上是生活随笔為你收集整理的AOP的两种实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。