在Java中,代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和实际对象之间的中介,可以在访问实际对象前后进行一些额外的操作。
代理模式的主要目的是为了提供一种间接访问方式,以便于控制对真实对象的访问。它可以用于实现访问控制、远程访问、延迟加载等功能。
实现代理模式的关键是创建一个代理类,该代理类持有一个真实对象的引用,并在方法中调用真实对象的对应方法。通过代理类来控制对真实对象的访问,并可以在访问前后进行一些额外的操作。
业务中的功能不得不写,但是写了又会影响代码的耦合性 这样的问题适合使用代理模式
事务管理
Spring的事务管理功能通常使用代理模式来实现。通过在业务方法前后添加事务管理的逻辑,代理对象可以控制事务的开始、提交或回滚,并提供了对事务的管理和控制。
AOP(面向切面编程)
Spring的AOP功能也是基于代理模式实现的。通过定义切点和切面,代理对象可以在目标对象的方法执行前后插入额外的横切逻辑,如日志记录、性能监控、安全验证等。
确定代理类型:在Java中,有两种常见的代理类型:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理则是在运行时生成代理对象。
注意代理对象的生命周期:在使用代理模式时,需要注意代理对象的生命周期。确保在适当的时候创建和销毁代理对象,以避免资源泄漏或不必要的开销。
松耦合
代理模式可以将目标对象与代理对象解耦,使得它们可以独立地进行修改和扩展。
保护目标对象
代理对象可以保护目标对象,隐藏其真实实现细节,提高系统的安全性。
控制访问
代理对象可以控制对目标对象的访问,可以在调用目标方法前后添加额外的逻辑,如权限验证、日志记录等。
AOP支持
代理模式是实现面向切面编程(AOP)的一种重要方式,在Spring框架中广泛应用于事务管理、日志记录、性能监控等方面
复杂性增加:代理模式会增加代码的复杂性,特别是在使用动态代理时,需要理解和处理动态生成的代理类。
代理对象应该只关注与目标对象相关的职责,不应该承担过多的额外职责。
代理对象和被代理者实现同一个接口
代理对象继承被代理者. 父子关系
1> 静态代理
构建接口
目标方法(实现接口)业务的处理
创建代理对象(也要实现接口)
测试
优点
1.设计结构上解耦.
2.过代理对象将耦合的代码与目标对象进行分离
缺点
1代码冗余的部分 依然没有解决.
2.工作中不使用静态代理. 一般都用动态代理.
2>动态代理
1.JDK动态代理
要求: 被代理者必须有接口
编辑代理对象
测试
优点
简单易用:使用JDK动态代理可以快速创建代理对象,无需手动编写代理类。
无侵入性:对目标对象无需做任何修改,只需要定义接口即可。
可扩展性:由于基于接口,可以灵活地添加新的接口或方法,以满足不同的需求。
高效性:JDK动态代理使用了字节码生成技术,生成的代理类在运行时性能较高。
缺点
基于接口:JDK动态代理只能代理实现了接口的类,无法代理没有实现接口的类。
限制:JDK动态代理只能代理接口中定义的方法,无法代理类中的非接口方法。
直接调用:由于代理对象实际上是通过反射来调用目标对象的方法,因此相比直接调用目标对象的方法,会有一定的性能损耗。
无法处理final方法:JDK动态代理无法代理目标对象中的final方法。
2.Cglib动态代理
要求: 代理对象是目标对象的子类.
编辑代理对象
测试
优缺点
CGLIB动态代理适用于需要代理没有实现接口的类或需要代理类中的final方法的场景。它具有强大的功能和较高的性能。
需要注意可能导致内存溢出的问题,并且无法代理final类和构造函数。如果目标类是一个普通的类并且需要代理其中的非final方法,可以考虑使用CGLIB动态代理。
JDK
Cglib
代理方式
通过反射创建代理对象
通过字节码文件创建生成代理对象
效率
创建对象的效率高,但是执行的效率低
读取字节码文件 所以创建对象的效率低, 执行效率高
引入jar包的方式
是java原生提供的
需要额外的引入jar包
代理方式不同
需要实现接口
只需要添加父类就可以.
在不修改源码的条件下,对方法的功能进行扩展解耦,一般采用JDK动态代理,但如果需要代理没有实现接口的类或处理final方法,就需要考虑使用Cglib动态代理。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/8623.html