
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
软件开发设计模式是大多数Java程序员都需要熟练掌握并应用的一个编程技术,而本文我们就通过案例分析来简单了解一下,Java编程代理模式概念与应用分析。
一、代理模式
1、描述
代理模式属于结构型模式中的一种,通过对代理对象的调用来达到对原对象的增强、减弱作用。通过代理类的生成时机,我们将编译期就生成代理类的情况称之为静态代理模式,而在Java运行期动态生成代理类的场景称为动态代理模式。动态代理又基于接口和继承两种实现方式分别分为JDK动态代理和CGLib动态代理两种。
2、适用性
当访问对象不方便直接引用时(如原对象授权太过宽泛、需要对不同用户级别提供不同权限)。
原对象功能需要增加,可以通过代理模式在不影响原始类的基础上实现目的。
3、实现逻辑
抽取真实主题类需要代理的接口获取抽象主题类。
代理类和主题类共同实现抽象主题类。
代理类控制真实主题类生命周期。代理在完成⼀些任务后应将⼯作委派给服真实主题类的对象。
真实主题类:原始类、需要被代理的类。
抽象主题类:定义真实主题类中需要被代理类代理的接口。保证代理对象和原始对象的可交互性。
代理类:实现抽象主题类,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
4、JDK动态代理
Java中提供了一个动态代理类Proxy,Proxy不是上述中的代理类,而是通过其提供的静态方法(newProxyInstance方法)来动态创建代理对象。
5、CGLib动态代理
JDK动态代理和静态代理的必要前提是代理类和原始类都需要创建⼀个接⼝来实现代理和服务对象的可交换性。如果没有现成的服务接⼝,从服务类中抽取接⼝并⾮总是可⾏的,因为我们需要对服务的所有客户端进⾏修改,让它们使⽤接⼝。所以我们的备选方案将代理作为服务类的⼦类,这样代理就能继承服务的所有接⼝了。
这里需要注意,CGLib生成代理类的本质是生成原始类的子类,因此无法代理被final修饰的类,或者被final修饰的方法,且会将原始类可被继承的方法完全暴露给客户端。
这里简单提一下,在JDK1.8过后,JDK动态代理效率高于CGLib动态代理,SpringAOP中也是根据需代理类的方法有无接口来优先判断是否使用JDK动态代理。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。