第一章:静态代理设计模式
对于JavaEE三层架构开发 最重要的是Service层
Service层包含了哪些代码 ?
Service层中 = 核心功能(几十行 上百行的代码) + 额外功能(附加功能)
其中分为核心功能和额外功能:
1.核心功能:
业务运算 DAO调用
2.额外功能的特点:
不属于业务 可有可无 代码量很小 !
额外功能:事务,日志,性能等

日志:

性能:

额外功能书写在Service层中好不好 ?
Service层的调用者的角度(Controller 控制层):需要在Service层进行书写额外功能的代码
但是对于软件设计者来说:Service不需要额外功能 代码过多 难于维护 !
租房场景改造

解决方法 :

静态代理开发:
通过代理(中介)类,为原始(房东)类 增加额外的功能
好处:
有利于进行对原始(房东)类的维护,因为原始类是进行编写主要业务方法的类 是具有成百上千行代码的类。如果经常进行改动这个类的代码,是不利于进行维护的 !
名词解释:
1.目标类 原始类
指的是业务类 (核心功能:业务运算 DAO的调用)
2.目标方法,原始方法
目标类(原始类)中的方法 就是目标方法(原始方法)
3.额外功能:就是附加功能
日志 事务 性能
代理开发的核心要素
代理类 = 目标类(原始类) + 额外功能 + 和原始类(目标类)实现相同的接口
为什么和原始类实现相同的接口 ?
其实接口也是一组方法的规范 我们创建代理类的目的就是为了完成原始类不想要进行完成的额外功能这些不必要的方法
当我们重写了相同的方法之后 直接调用原始类中已经封装实现完成的逻辑业务方法即可
(用租房场景改造的话来说:
就是为了迷糊租客中介就是真正的房东 ,直到签合同的时候才会找到房东看房产证(也就是才会去调用业务类的逻辑业务方法)。
)

编码:




静态代理存在的问题:
1.静态类文件数量过多,不利于项目管理
我们每出现一个原始类 我们就要进行创建一个对应的代理类
2.额外功能维护性差
代理类中 额外功能修改复杂 !十分麻烦
一个原始类对应一个代理类。所以有可能我们的代理类有成百上千个,其中对应的额外功能也有许多 我们修改会十分复杂
但是:Spring为我们提供了动态代理开发模式
第二章:动态代理开发
概念
通过代理类为原始类(目标类)进行增加额外功能
好处:有利于原始类(目标类)的维护
搭配开发环境

Spring动态代理的开发步骤

1.创建原始对象(目标对象) 并且实现接口


2.额外功能:我们实现的是MethodBeforeAdvice接口
由于Spring已经底层制定了动态代理,所以我们在实现接口时重写的方法中进行编写我们想要增加的额外功能
这些增加的额外功能 会执行运行到我们指定运行的原始方法之前 !


3.定义切入点
切入点:即是额外功能加入的位置
目的:由程序员根据自己需要,决定额外功能加入到哪一个原始方法

4.进行组装切入点和额外功能

5.动态代理开发一定程度上解决了静态代理的缺点
Spring内置规定:
我们getBean(原始类的id :userService )获取到的是原始对象对应的代理对象。
这个代理对象具有原始对象的原始方法以及我们提供实现接口之后 在重写的before方法中增加的额外功能。
但是这个代理类并没有存在真正的java 或class文件 所以这种动态代理的方式完美的解决了静态代理时出现的问题 !

测试:

动态代理细节:
1.Spring创建的动态代理类在哪里?
Spring框架在运行时,通过动态字节码技术,在JVM创建的,运行在JVM内部,等程序结束之后,会和JVM一起消失 !
什么叫做动态字节码技术?
通过这三个动态字节码框架,在JVM中创建对应类的字节码,进而进行创建对应的对象。当JVM虚拟机结束之后,动态字节码也会跟着消失。
结论:
动态代理不需要定义类文件,都是在JVM运行过程中动态创建的,所以不会造成静态代理。类文件数量过多时 会影响项目管理的问题 !

2.动态代理编程极大的简化了代理的开发
在额外功能不改变的前提下 我们进行创建其他原始类的代理对象时 只需要进行指定原始对象即可 !

3.极大的提高了代码的维护性
假设说当我们对Before类中的before方法所实现的额外功能感到不满意的时候 我们想要对额外功能进行修改

动态代理就是比较方便进行维护额外功能 !
我们维护的时候要遵循原则:关闭修改 进行扩展 !
我们进行新添加一个Before02类 进行替代原来的Before类 把新额外功能写在Before02类中的before方法中即可

然后在Spring配置文件中进行配置Before02这个类 :

第三章:动态代理详解
MethodBeforeAdvice(了解):
1.MethodBeforeAdvice接口的作用:能够使额外功能运行在原始方法执行之前,进行额外功能的操作 !

2.这个before方法中的三个参数 不一定会使用到 也有可能不使用
意思就是不是强制你去进行使用 !

MethodInterceptor接口(常用):



原始方法运行的四个时机
额外功能运行在原始方法之前


影响原始方法的返回值(了解即可)

切入点表达式详解

方法切入点详解:


但是上面这些切入点表达式都不太精准 !
解决方法如下:

使用全类名进行确定方法名 这种方式可以避免多个包下同名方法的错误使用

类切入点详解:




包切入点


切入点函数


proxy包及其子包下的所有的方法 !
@annotation切入点函数

自定义注解:

把自定义的注解标记到我们的原始方法上




动态代理总结:

第四章:AOP编程
前面我们所学习的Spring动态代理开发就是AOP编程开发思想
AOP OOP POP 的概念说明:
AOP: 面向切面编程 即是Spring动态代理开发
以切面为基本单位的程序开发,通过切面之间的彼此协同 相互调用 完成程序的构建
OOP:
面向对象编程 Java !
以对象为基本单位的程序开发,通过对象间的彼此协同 相互调用,完成程序的构建。
POP: 面向过程(方法 函数)编程 C语言
以过程为基本单位的程序开发 通过过程间的彼此协同,相互调用,完成程序的构建
AOP的概念:
本质 就是Spring动态代理开发,通过代理类为原始类进行增加额外功能
好处:利于原始类的维护 !
注意:AOP编程不可能取代OOP编程 因为AOP编程也是基于类的 !它是OOP编程的一种有益补充 !
AOP编程的开发步骤:
1.构建原始对象
2.进行添加额外功能 (即是一个类进行实现MethodInterceptor接口,然后在重写的invoke方法中进行写额外功能)
3.定义切入点
4.组装切面(额外功能+切入点)
切面的名词 解释 :
切面 = 切入点 + 额外功能
几何学:
面 = 点 + 相同的性质
如图所示:
这三个类中具有三个方法 ,被视为是三个切入点 ! 这三个切入点具有相同的额外功能
那么就可以把这三个切入点连接起来 这样就构建成为了一个面 横切在其中。我们就称之为切面 !