离上次回顾了依赖注入的方式和注解也有一段时间了,那段时间看起了前端相关的js、jquery和ajax的一些内容,因为接下来需要做一个手机App,想尝试用Java来搭建它的后台,现在使用的是SpringBoot框架在搭建,已经实现了一点基本功能吧(登录注册和跳转主页)与前端也可以交互。接下来也要继续加油了。
不过Spring的知识也要继续回顾,接下来回顾一下Spring的AOP
(面向切面编程),这篇就先来记录一下对于动态代理的学习。
一、代理模式是什么
- 它是二十三种设计模式中的一种,也是Spring的AOP特性实现的基础。
- 定义: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
二、 代理模式的优点
- 1、可以实现在不修改源码 的情况下,扩展新功能,也可以理解为是对方法的增强
- 2、使得项目的扩展和维护比较方便
三、 代理模式的分类
-
1、静态代理模式:
从以上代码可以比较清晰的看出静态代理模式中 -
(1)代理对象和被代理对象实现了相同的接口Theme;
-
(2)代理对象中创建了被代理对象RealTheme;
-
(3)main中创建代理对象调用方法时,不仅会调用被代理对象的方法,还会调用增强方法PreRequest和PostRequest;
这也侧面的暴露了一个问题,假如我要换个主题,那我就得再写一个接口和新的代理,也就是说静态代理模式存在着只适合某一种业务,不易扩展。
-
2、动态代理模式:
-
(一)基于接口的动态代理
被代理对象至少需要实现一个接口
- (二)基于子类,也就是通过继承来实现
被代理对象要求必须能被继承, 通过第三方库chlib实现
动态代理分为基于接口与基于子类两种,前者要求被代理对象要至少实现一个接口,后者要求被代理对象不能是final声明的最终类。相对来说,动态代理会比静态代理更具可扩展性。