Spring代理模式——cglib

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Heavy_Dream/article/details/79954344
3、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());
}


}

猜你喜欢

转载自blog.csdn.net/Heavy_Dream/article/details/79954344