一、设计模式

1.1 增强一个类功能,把已有的类进行一个拓展

继承(高内聚,低耦合)

​ 缺点:继承的越多,耦合性越高,改动一个,受影响的越多

​ 用继承来增强:增强的对象不能变,增强的功能是可以变的

​ ==原因:==子类可以无限派生,但子类的功能写死了,不能变,只要增加一个功能就要增加一个子类,会造成类很多,不好用

Spring6-AOP概念

​ 装饰者模式来增强:增强的对象可以变,增强的功能不能变

​ 下面来进行对比

二、装饰者模式

示例

一杯coffee,在原来咖啡的基础上进行包装,返回一个加糖加盐加奶的咖啡,但返回的永远是咖啡,功能不变

Spring6-AOP概念Spring6-AOP概念

Spring6-AOP概念

功能主要靠父类实现

Spring6-AOP概念

bufferwriter装饰器数据流,就是在上面加了一个缓存区,真正的功能还是由out.write来实现

Spring6-AOP概念

二、静态代理(WTF?)

没有标准,网上写的很多版本,就跟把继承和装饰者拼一起差不多,真正的设计模式里根本没有静态代理

示例

把装饰者模式的范围写的更小了,传的就是someservice的一个实现类,只能增强一个实现类,功能太弱,其实就是继承,没什么乱用

Spring6-AOP概念

三、动态代理

dynamicproxy

一个类写的不是很好,怎么办

再实现一个类:不好,不灵活

动态代理来增强:

3.1 Proxy方法增强

JDK自带的动态代理,要增强的对象必须实现接口

Spring6-AOP概念

SomeServiceImpl()是增强目标对象

Proxy方法三个参数

Spring6-AOP概念

3.1.1类加载器

ClassLoader loader

3.1.2 接口类型

Class<?>[] interfaces

没有借口用类似cglid.jar包,没有借口也能增强

3.1.3 接口(执行扩展的增强功能,实现接口的方法,实现增强)

匿名内部类:实质就是一个接口的实现类

只能用一次,不能复用

Spring6-AOP概念

系统会给你定义一个类

Spring6-AOP概念

想复用定义在外面就可以

又有三个参数

Spring6-AOP概念

动态代理最灵活(增强的类可以变,功能也可以变),但实际应用要看实际情况,像buffer装饰者模式就没必要用动态代理,它的功能是固定的

Spring6-AOP概念

底层给你创建的增强的动态代理对象,就是接口的实现类对象

Spring6-AOP概念

mybatis的getMapper的底层就是动态代理

四、示例

前置增强和后置增强

Spring6-AOP概念

区分方法增强,加判断

Spring6-AOP概念

把do开头的方法都用大写表示,想怎么配自己去控制

Spring6-AOP概念

相关文章: