1. 程式人生 > >Spring總結七:AOP動態代理的實現

Spring總結七:AOP動態代理的實現

product div image style 攔截 throwable eth oid void

Spring中的AOP代理可以使JDK動態代理,也可以是CGLIB代理,前者基於接口,後者基於子類。

首先我們來用代碼簡單演示jdk動態代理:

現在有一個商品的增刪改查的操作

/**
 * 商品操作接口
 */
public interface ProductService {
    public void add();
    public void edit();
    public void delte();
    public void select();
}

/**
 * 實現類
 */
public class ProductServiceImpl implements
ProductService { @Override public void add() { System.out.println("添加商品"); } @Override public void edit() { System.out.println("修改商品"); } @Override public void delte() { System.out.println("刪除商品"); } @Override public
void select() { System.out.println("查詢商品"); } }

我們編寫一個基於jdk的動態代理(實現InvocationHandler接口):

public class JdkProxy implements InvocationHandler {

    //被代理的目標
    private Object target;

    //構造函數 傳入目標對象
    public JdkProxy(Object target) {
        this.target = target;
    }

    
//提供創建代理對象的方法 public Object createProxy() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 實現InvocationHandler接口的回調方法, 攔截目標對象所有方法都會執行invoke方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我是代理,我對被代理的目標有絕對的控制權..."); Object returnVal = method.invoke(target, args); System.out.println("--------------------------------------"); return returnVal; } }

測試代碼:

public class JdkProxyTest {
    @Test
    public void testJdkProxy() {
        //創建對象
        ProductService target = new ProductServiceImpl();
        //創建代理對象
        JdkProxy jdkProxy = new JdkProxy(target);
        //代理面向接口
        ProductService proxy = (ProductService) jdkProxy.createProxy();
        //通過代理調用方法
        proxy.add();
        proxy.edit();
        proxy.delte();
        proxy.select();
    }
}

運行結果:

技術分享圖片

Spring總結七:AOP動態代理的實現