Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。
【dao】
package com.athl.dao;
/**
* 目标对象
*/
public class PersonDao {
public void delete(){
System.out.println("---删除操作---");
}
}
【CglibProxyFactory】
package com.athl.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* Cglib子类代理工厂
* (对PersonDao 在内存中动态构建一个子类对象)
*/
public class CglibProxyFactory implements MethodInterceptor {
/* 维护目标对象*/
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
/* 给目标对象创建代理对象*/
public Object getProxyInstance(){
/*1. 工具类*/
Enhancer en = new Enhancer();
/*2. 设置父类(以子类方式在内存中动态创建代理对象,需要知道子类的父类,
* 此处为target,即是PersonDao的实例对象)
*/
en.setSuperclass(target.getClass());
/*3. 设置回调函数(执行target类里的方法时,会触发拦截器中的方法)*/
en.setCallback(this);
/*4. 创建子类(代理对象)*/
return en.create();
}
/*
* CGLib采用非常底层的字节码技术,可以为一个类创建一个子类,
* 并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势植入横切逻辑。
*/
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
/*添加其它代码*/
System.out.println("--开启事务--");
/*执行目标对象的方法*/
Object returnValue = method.invoke(target, args);
/*添加其它代码*/
System.out.println("--提交事务--");
return returnValue;
}
}
【test】
package com.athl.test;
import org.junit.Test;
import com.athl.dao.PersonDao;
import com.athl.proxy.CglibProxyFactory;
public class Mytest {
@Test
public void test() {
/*目标对象*/
PersonDao target = new PersonDao();
System.out.println(target.getClass());
/*代理对象*/
PersonDao proxy = (PersonDao)new CglibProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
/*执行代理对象的方法*/
proxy.delete();
}
}