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