spring代理之cglib代理
当代理类不需要implements接口时,我们就使用cglib代理。实现了一个接口时我们就使用jdk代理。
UserDao.java
package cn.itcast.c_cglib;
/**
* 目标对象
* @author Jie.Yuan
*
*/
public class UserDao {
public void save() {
System.out.println("-----已经保存数据!!!------");
}
}
ProxyFactory.java
package cn.itcast.c_cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* Cglib子类代理工厂
* (对UserDao 在内存中动态构建一个子类对象)
* @author Jie.Yuan
*
*/
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 obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("开始事务.....");
// 执行目标对象的方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事务.....");
return returnValue;
}
}
编写测试类。
App.java
package cn.itcast.c_cglib;
public class App {
public static void main(String[] args) {
// 目标对象
UserDao target = new UserDao();
// class cn.itcast.c_cglib.UserDao
System.out.println(target.getClass());
// 代理对象
UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
// UserDao子类:class cn.itcast.c_cglib.UserDao$$EnhancerByCGLIB$$25d4aeab
System.out.println(proxy.getClass());
// 执行代理对象的方法
proxy.save();
}
}
运行结果:
class cn.itcast.c_cglib.UserDao
class cn.itcast.c_cglib.UserDaoEnhancerByCGLIBe0da0a2b
开始事务…..
—–已经保存数据!!!——
提交事务…..