代理三要素:
1)被代理的目标
2)代理的增强类
3)增强类和目标的关联
这里演示spring使用的动态代理,所以需要依赖spring core核心包,该包已经集成了Cglib
spring core依赖的maven坐标:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
一:目标对象
public class CustomerService {
public int save() {
System.out.println("保存客户");
return 1;
}
public void update() {
System.out.println("修改客户");
}
public void delete() {
System.out.println("删除客户");
}
public void search() {
System.out.println("查询客户");
}
}
二:代理增强类
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
// 工具类,对目标进行cglib代理
public class CglibProxyFactory implements MethodInterceptor {
// 被代理目标对象
private Object target;
// 1、 通过构造器,传入被代理目标对象
public CglibProxyFactory(Object target) {
this.target = target;
}
// 2、 提供生成代理对象的方法
public Object createProxy() {
// 用于生成代理 API类
Enhancer enhancer = new Enhancer();
// 设置目标类,根据类生成子类代理
enhancer.setSuperclass(target.getClass());
// 设置回调函数
enhancer.setCallback(this);
// 生成代理返回
return enhancer.create();
}
@Override
// 3、 编写回调拦截函数,拦截目标对象所有方法
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
System.out.println("记录日志:" + method.getName() + "方法被调用....");
return methodProxy.invokeSuper(proxy, args);// 调用父类(真实对象)的方法
// return method.invoke(target, args);
}
}
三:关联关系
public class CglibProxyTest {
@Test
// 测试 cglib代理
public void testCglibProxy() {
// 目标
CustomerService target = new CustomerService();
// 生成代理
CglibProxyFactory factory = new CglibProxyFactory(target);
CustomerService proxy = (CustomerService) factory.createProxy();
// 调用代理对象的方法
proxy.save();
proxy.update();
proxy.delete();
proxy.search();
}
}
执行结果: