Spring代理模式——cglib
子類代理。在記憶體中構建一個子類物件從而實現目標物件的擴充套件
步驟:
引用jar檔案--Spring Core包中包含
在記憶體中動態建立目標物件的子類class edu.cloud.cglib.UserDao$$EnhancerByCGLIB$$9a0d63a4
注意:
目標物件不能是final的
目標物件的方法是final和static 的,否則不會攔截
目標物件:
package edu.cloud.cglib;
/**
* 目標物件
* @author huangbaida
* @description
* @date 2018年1月23日
*/
public class UserDao {
public void save() throws Exception{
System.out.println("----資料儲存----");
}
public void update() throws Exception{
System.out.println("----資料已修改----");
}
}
代理物件:
package edu.cloud.cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class ProxyFactory implements MethodInterceptor {
//目標物件
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
//代理物件
public Object getProxyInstance() {
//1.工具類
Enhancer en = new Enhancer();
//2.設定相應的父類
en.setSuperclass(target.getClass());
//3.設定回撥方法
en.setCallback(this);
//4.建立代理物件
return en.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
//
System.out.println("開始事務");
//執行目標物件的方法
Object resultValue = method.invoke(target, arg2);
System.out.println("提交事務");
return resultValue;
}
}
測試:
package edu.cloud.cglib;
public class Test {
public static void main(String[] args) {
//目標物件
UserDao target = new UserDao();
//代理物件
UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
try {
proxy.save();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(proxy.getClass());
}
}