上一篇文章介绍了使用JDK生成动态代理的方法,这篇文章将介绍使用Cglib生成动态代理的方法。
JDK生成代理是基于接口的开发的,如果没有接口,不能使用JDK生成动态代理,只能使用Cglib方法。
步骤如下:
在ch03项目下完成,目录结构如下:
基于Cglib的方法,必须引入jar包如上图所示。
1.UserDao类中定义几个方法,代码如下
package com.zdxh.cglib;
public class UserDao {
public void add() {
System.out.println("add...");
}
public void delete() {
System.out.println("delete...");
}
public void update() {
System.out.println("update...");
}
public void find() {
System.out.println("find...");
}
}
2.设计Cglib生成动态代理的类
在此,假如我们还是要在调用add方法前,执行方法增强,为简单所示,我们只是简单打印一句话。
package com.zdxh.cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibProxy {
private Object obj;
public CglibProxy(Object obj) {
super();
this.obj = obj;
}
public Object createProxy(Object obj) {
Enhancer enhancer = new Enhancer();
//因为cglib是基于继承的,所以要设置父类
enhancer.setSuperclass(obj.getClass());
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] arg2, MethodProxy methodProxy) throws Throwable {
//如果是add方法,在执行之前增强
if("add".equals(method.getName())) {
System.out.println("检查权限.....增强");
return methodProxy.invokeSuper(proxy, arg2);
}
//如果不是add方法,不增强
return methodProxy.invokeSuper(proxy, arg2);
}
});
//生成代理对象
return enhancer.create();
}
}
3.设计测试类
package com.zdxh.cglib;
import org.junit.jupiter.api.Test;
public class CglibTest {
@Test
public void ptTest() {
UserDao userDao =new UserDao();
UserDao proxy=(UserDao) new CglibProxy(userDao).createProxy(userDao);
proxy.delete();
proxy.add();
proxy.update();
proxy.find();
}
}
4.运行测试方法,结果如下:
总结:本文介绍了使用Cglib生成动态代理的步骤。