參考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments
CGLIB動態代理
定義:CGLIB(code genaration libary), 代碼自動生成類庫。
在程序運行中自動生成擴展類和實現java接口,是一個強大的高性能的代碼生成包
CGLIB動態代理的實現
1)、導入cglib所需的jar包
2)、實現MethodIntercetor類,實現代理類對象的具體邏輯
重寫intercept()方法,在intercept方法中實現代理的邏輯
intercept(Object o, Method method, Object[] Objects, MehodProxy methodProxy )
o: 被代理類對象
method: 被代理類的方法
objects: 被代理類方法的參數
methodProxy: 調用被代理類對象的參數
3)、使用Enhance生成代理類對象
enhance.create() //生成代理類對象
使用CGLIB實現延遲加載
MehodInterceptor實現類:
/**
* 實現代理的邏輯
* 步驟:
* --: 1、實現MethodInterceptor攔截器
* o: 被代理對象
* method: 被代理對象的方法
* objects: 被代理對象的方法參數
* methodProxy: 觸發父類方法的對象
*/
public class DBQueryCglibMethodInterceptor implements MethodInterceptor {
DBQuery dbQuery = null;
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if(dbQuery == null){
dbQuery = new DBQuery();
}
return dbQuery.Request();
}
}
真實類:
/**
* 使用cglib來實現數據庫的查詢
*/
public class DBQuery {
public String Request(){
return "數據庫查詢完畢";
}
}
使用類:
public class Client {
public static void main(String[] args) {
/**
* 創建增強類對象
*/
Enhancer enhancer = new Enhancer();
/**
* 創建增強類的父類對象
*/
enhancer.setSuperclass(DBQuery.class);
/**
* 創建攔截切入類
*/
enhancer.setCallback(new DBQueryCglibMethodInterceptor());
/**
* 創建代理對象
*/
DBQuery dbQueryProxy = (DBQuery) enhancer.create();
String result = dbQueryProxy.Request();
System.out.println(result);
}
}
結果:
數據庫查詢完畢
使用CGLIB增強原有類的功能
MethodIntercptor實現類
/**
* cglib代理邏輯切入類
* ---: intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
* o: 被代理類對象
* method: 要攔截的被代理類的方法
* objects:被代理類的方法參數
* methodyProxy: 要觸發父類的方法對象
*/
public class CglibMethodInteceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("插入前置通知");
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("插入后置通知");
return object;
}
}
真實類:
/**
* 使用cglib實現動態代理,不用創建接口
*/
public class HelloService {
HelloService(){
System.out.println("HelloServie構造器");
}
public final String sayOthers(String name){
System.out.println("HelloService: sayOthers" +name);
return null;
}
public void sayHello(){
System.out.println("HelloService: sayHello");
}
public void sayByeBye(){
System.out.println("HelloService: sayByeBye");
}
}
使用類:
public class Client {
public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
/**
* 創建增強類對象
*/
Enhancer enhancer = new Enhancer();
/**
* 創建需要增強的父類對象
*/
enhancer.setSuperclass(HelloService.class);
/**
* 設置切入類對象
*/
enhancer.setCallback(new CglibMethodInteceptor());
/**
* 生成代理對象
*/
HelloService service = (HelloService) enhancer.create();
service.sayHello();
service.sayByeBye();
}
}
結果:
HelloServie構造器
插入前置通知
HelloService: sayHello
插入后置通知
插入前置通知
HelloService: sayByeBye
插入后置通知