当前位置: 首页 > news >正文

【Spring Boot】Spring AOP动态代理,以及静态

Spring AOP 动态代理与静态代理的区别

Spring AOP(面向切面编程)主要基于动态代理实现,而静态代理是另一种代理模式。以下是两者的核心区别和实现方式:


动态代理

动态代理在运行时动态生成代理类,无需手动编写代理类代码。Spring AOP 默认使用动态代理,具体分为两种实现方式:

1. JDK 动态代理

  • 基于接口实现,要求目标类必须实现至少一个接口。
  • 通过 java.lang.reflect.Proxy 生成代理对象。
  • 示例代码:
    public interface UserService {void save();
    }public class UserServiceImpl implements UserService {public void save() {System.out.println("保存用户");}
    }public class JdkProxyFactory {public static Object getProxy(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),(proxy, method, args) -> {System.out.println("前置增强");Object result = method.invoke(target, args);System.out.println("后置增强");return result;});}
    }
    

2. CGLIB 动态代理

  • 基于继承实现,无需接口,通过字节码技术生成目标类的子类。
  • 适用于未实现接口的类。
  • 示例代码:
    public class UserService {public void save() {System.out.println("保存用户");}
    }public class CglibProxyFactory implements MethodInterceptor {public Object getProxy(Class<?> clazz) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("前置增强");Object result = proxy.invokeSuper(obj, args);System.out.println("后置增强");return result;}
    }
    

静态代理

静态代理需要手动编写代理类,在编译时确定代理关系。适用于代理逻辑固定且简单的场景。

实现示例

public interface UserService {void save();
}public class UserServiceImpl implements UserService {public void save() {System.out.println("保存用户");}
}public class UserServiceProxy implements UserService {private UserService target;public UserServiceProxy(UserService target) {this.target = target;}public void save() {System.out.println("前置增强");target.save();System.out.println("后置增强");}
}

静态代理的局限性

  • 代理类与目标类一一对应,代码冗余。
  • 修改代理逻辑需修改所有代理类,维护成本高。

动态代理与静态代理的对比

特性动态代理静态代理
生成时机运行时动态生成编译时手动编写
灵活性高(可动态适配不同类)低(需手动编写)
性能略低(反射开销)高(直接调用)
适用场景Spring AOP、复杂逻辑简单逻辑、固定代理需求

Spring AOP 的默认行为

  • 若目标类实现了接口,默认使用 JDK 动态代理
  • 若目标类未实现接口,使用 CGLIB 动态代理
  • 可通过配置强制使用 CGLIB:
    spring.aop.proxy-target-class=true
    

静态代理的适用场景

  • 代理逻辑简单且固定。
  • 需要极致性能(如高频调用场景)。
  • 无法依赖动态代理库(如特殊环境限制)。
http://www.dtcms.com/a/553733.html

相关文章:

  • 使用Requests和正则表达式实现网络小说爬取技术解析
  • spine动画监听动作播放完成重复执行
  • ui设计网站开发乡村建设的网站
  • 最新版 dify 如何离线安装插件
  • html网站的直播怎么做绵阳个人网站建设
  • 苯乙烯自由基聚合与丙交酯开环聚合的MATLAB模拟
  • 从一到无穷大 #53 Beyond TSDB Query performance: Homomorphic Compression
  • 张掖建设网站眉山市建设局网站
  • Android和springboot的后端json数据库mysql传送
  • 旅游网站系统商标购买网商标
  • 好用的 display: flow-root
  • 做路牌的网站深圳做外贸网站公司
  • C++笔记(面向对象)多重继承 菱形继承
  • 淘宝商品详情 API(taobao.item.get)从 0 到 1:申请流程、核心参数与首次调用实战
  • 大连市建设部网站官网权威的网站建设公司
  • 【Day 83】虚拟化-openstack
  • C语言类型转换和溢出常见错误
  • 《计算类云服务》
  • CentOS7 搭建DHCP服务器(一台服务器虚拟机+2台客户端虚拟机演示)
  • 【MySQL】mysqldump使用方法
  • Docker化你的Python应用:从开发到生产
  • 做网站需要多少兆空间安徽网站优化好不好
  • 【weblogic】协议反序列化漏洞
  • LeetCode 287. 寻找重复数
  • C#理论学习-WinForm实践开发教程总结
  • 深入浅出 ES Module
  • 深度学习专题:模型训练的数据并行(二)
  • 企业网站建设方案新闻网站购买域名
  • C++ STL 有序关联容器高频面试题解析
  • 腾讯风铃怎么做网站成都哪家做网站