1.概述
在spring 开源框架中,很多情况下使用了动态代理技术,比如 FEIGN, MYBATIS 的Mapper接口,还有比如spring 的事务管理。
2. 动态代理实现
动态代理实现技术有两种方式。
1.使用jdk的动态代理
只适用在有接口的情况下
2.使用CGLIB
- 支持接口代理
- 只是无接口代理
2.1 使用接口代理的方式
使用代码实现:
- 接口定义
public interface IUserService {
String addUser(String name);
}
- 实现类定义
public class UserService implements IUserService{
@Override
public String addUser(String name) {
System.err.println("添加用户:" +name);
return "user:" + name ;
}
}
- 动态代理实现
public class DynamicProxy {
public static <T> T createProxy(T servie){
T proxy = (T) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),
servie.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.err.println("前置执行。。。");
method.invoke(servie,args);
System.err.println("后置执行。。。");
return null;
}
});
return proxy;
}
}
- 代理执行
public class JdkProxyDemo {
public static void main(String[] args) {
IUserService iUserService=new UserService();
IUserService proxy= DynamicProxy.createProxy(iUserService);
proxy.addUser("老王");
}
}
2.2 使用GCLIB的方式
- 引入cglib 包
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
- 被代理类
public class UserService {
String addUser(String name) {
System.err.println(name);
return name;
}
}
- 代理增强类
public class ServiceInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.err.println("前置执行...");
Object result = methodProxy.invokeSuper(obj, objects);
System.err.println("后置执行...");
return result;
}
}
- 实现代理
public class ProxyDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new ServiceInterceptor());
UserService userService = (UserService) enhancer.create();
userService.addUser("老王");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2018-10-10 SPRING 事务管理说明
2008-10-10 自定义长时间定时器对象