ProxyUtils是一个动态代理工具类,基于JDK动态代理和CGLIB动态代理,并对这两种动态代理API进行了封装,让使用更方便。
ProxyUtils提供以下功能特性:
- 灵活的方法拦截器配置
- 灵活的方法匹配器配置
- 丰富的预定义方法拦截器和方法匹配器
- 动态创建接口实现类
- 动态创建子类
- 根据目标对象自动选择代理类型(JDK或CGLIB)
-
添加maven仓库地址
<repositories> <repository> <id>byx-maven-repo</id> <name>byx-maven-repo</name> <url>https://gitee.com/byx2000/maven-repo/raw/master/</url> </repository> </repositories>
-
添加maven依赖
<dependencies> <dependency> <groupId>byx.util</groupId> <artifactId>ProxyUtils</artifactId> <version>1.0.0</version> </dependency> </dependencies>
通过一个简单例子来快速了解ProxyUtils。
UserDao
接口:
public interface UserDao {
int listAll();
int listById(int id);
void deleteByName(String name);
}
UserDaoImpl
实现类:
public class UserDaoImpl implements UserDao {
@Override
public int listAll() {
System.out.println("正在执行listAll方法");
return 123;
}
@Override
public int listById(int id) {
System.out.println("正在执行listById方法:id = " + id);
return 456;
}
@Override
public void deleteByName(String name) {
System.out.println("正在执行deleteByName方法:name = " + name);
}
}
主函数:
import byx.util.proxy.ProxyUtils;
import byx.util.proxy.core.MethodInterceptor;
import byx.util.proxy.core.MethodMatcher;
import java.util.Arrays;
import static byx.util.proxy.core.MethodMatcher.*;
public class Main {
public static void main(String[] args) {
// 定义方法拦截器
MethodInterceptor interceptor = targetMethod -> {
MethodSignature signature = targetMethod.getSignature();
Object[] params = targetMethod.getArgs();
System.out.println("开始拦截" + signature.getName() + "方法");
System.out.println("原始参数:" + Arrays.toString(params));
Object ret = targetMethod.invoke(params);
System.out.println("原始返回值:" + ret);
System.out.println("结束拦截" + signature.getName() + "方法");
return ret;
};
// 定义方法匹配器:匹配所有方法名以list开头且返回值为int类型的方法
MethodMatcher matcher = withPattern("list(.*)").andReturnType(int.class);
// 创建AOP代理对象
UserDao userDao = ProxyUtils.proxy(new UserDaoImpl(), interceptor.when(matcher));
userDao.listAll();
System.out.println();
userDao.listById(1001);
System.out.println();
userDao.deleteByName("XiaoMing");
}
}
开始拦截listAll方法
原始参数:null
正在执行listAll方法
原始返回值:123
结束拦截listAll方法
开始拦截listById方法
原始参数:[1001]
正在执行listById方法:id = 1001
原始返回值:456
结束拦截listById方法
正在执行deleteByName方法:name = XiaoMing
从输出结果可以看到,UserDaoImpl
中的listAll
方法和listById
方法都被增强了,而deleteByName
方法没有被增强。