代理模式设计原则
1.代理类与委托类具有相似的行为(共同)
2.代理类增强委托类的行为
静态代理
代理角色是固定的,比如说我们有20个dao层,我们要想对这20个dao做代理,那我们就要写20个代理类,也就是说委托类和代理类只能一对一
动态代理
在创建代理对象时更加灵活,根据需要通过反射机制在程序运行期动态的为目标对象创建代理对象,代理行为可以代理多个方法,满足生产需要又能达到代码通用的目的
动态代理实现方式
-
jdk(原生支持代理)
原理:基于接口实现,有两个类同时实现一个接口,就叫具有相似的行为
局限:很多类没有实现接口,那么jdk就无法实现代理 -
cglib(不属于jdk,是第三方类库)
原理:基于继承思想
作用:针对没有实现接口的类,进行代理总结
与jdk提供的代理区别,Proxy:委托类必须有接口,制作过程比较快,执行慢;cglib:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快。主要解决没有接口类的代理实现
AOP(面向切面编程)
AOP和OOP的区别:
OOP:面向对象把一个对象当做一个整体
AOP:面向有多个类的多个方法组合起来的切面,称为面向切面编程
用途:日志记录 性能统计 安全控制 事物处理,实现公共功能性的重复
使用AOP的优点:
1.降低了模块和模块之间的耦合度,提高业务代码的聚合度(高内聚,低耦合设计原则)
2. 提高了代码的复用性
3. 提高了程序的扩展性
连接点Joinpoint
被拦截到的每一个点,spring中指每一个被拦截到的方法,spring AOP中一个连接点既代表一个方法的执行
切入点Pointcut
对连接点进行拦截的定义(定义拦截规则,规定拦截哪些方法,对哪些方法进行处理)
通知Advice
在拦截方法的前后,做不同的功能,这就叫通知
1.前置通知(前置增强)–before() 执行方法前通知
2.返回通知(返回增强)–afterReturn() 方法正常结束返回后的通知
3.异常抛出通知 --afterThrow()
4. 最终通知 -after(),无论方式是否发生异常,均会执行该通知
5. 环绕通知—around 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行
Aspect(切面)
切面的定义是:拦截和通知的结合,就是切面,拦截哪些方法,拦截后要做什么就是切面
织入
程序在运行期间,拦截目标对象,为目标对象动态的生成代理对象的过程就叫织入
引入
在程序运行期间,在不改变一个原有类源码基础上,动态的为这个类添加字段和方法就叫引入