Spring 框架(五)(Spring CGLIB代理)

1.創建目標類

package dc.com.dao;

public class CustomerDaoImpl implements CustomerDao{
    @Override
    public void add() {
        System.out.println("添加客戶...");
    }
    @Override
    public void update() {
        System.out.println("修改客戶...");
    }
    @Override
    public void delete() {
        System.out.println("刪除客戶...");
    }
    @Override
    public void find() {
        System.out.println("修改客戶...");
    }
}

2.創建切面類

package dc.com.dc.com.jdk;

public class Aspect {
    public void myBefore() {
        System.out.println("方法執行之前");
    }
    public void myAfter() {
        System.out.println("方法執行之後");
    }
}

 

3.創建代理類。

package dc.com.dc.com.jdk;
import java.lang.reflect.Method;

import dc.com.dao.CustomerDaoImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class BeanFactory {
    public static CustomerDaoImpl getBean() {
        // 準備目標類
        final CustomerDaoImpl goodsDao = new CustomerDaoImpl();
        // 創建切面類實例
        final Aspect myAspect = new Aspect();
        // 生成代理類,CGLIB在運行時,生成指定對象的子類,增強
        Enhancer enhancer = new Enhancer();
        // 確定需要增強的類
        enhancer.setSuperclass(goodsDao.getClass());
        // 添加回調函數
        enhancer.setCallback(new MethodInterceptor() {
            // intercept 相當於 jdk invoke,前三個參數與 jdk invoke—致
            @Override
            public Object intercept(Object proxy, Method method, Object[] args,
                                    MethodProxy methodProxy) throws Throwable {
                myAspect.myBefore(); // 前增強
                Object obj = method.invoke(goodsDao, args); // 目標方法執行
                myAspect.myAfter(); // 後增強
                return obj;
            }
        });
        // 創建代理類
        CustomerDaoImpl goodsDaoProxy = (CustomerDaoImpl) enhancer.create();
        return goodsDaoProxy;
    }
}

 

4.創建測試類

package dc.com.dc.com.jdk;


import dc.com.dao.CustomerDaoImpl;
import org.junit.Test;

public class CGLIBProxyTest {
    @Test
    public void test() {
        // 從工廠獲得指定的內容(相當於spring獲得,但此內容時代理對象)
        CustomerDaoImpl goodsDao = BeanFactory.getBean();
        // 執行方法
        goodsDao.add();
        goodsDao.update();
        goodsDao.delete();
        goodsDao.find();
    }
}

 

測試結果


方法執行之前
添加客戶...
方法執行之後
方法執行之前
修改客戶...
方法執行之後
方法執行之前
刪除客戶...
方法執行之後
方法執行之前
修改客戶...
方法執行之後

Process finished with exit code 0

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章