0. 问题引入
理论生产环境中,存在着在现有运行我的项目性能的业务逻辑上,须要拓展新增业务性能的状况,此时大概率咱们改的我的项目不是咱们开发的,有可能存在以下问题:
- 有我的项目源代码:此时须要费时费力去浏览原来的源代码,弄懂有可能较为简单的业务逻辑,而后再来新增业务代码。可是……看懂代码可能须要一周,但领导要求三天搞定………………
- 我的项目长远已无源代码:此时真是头大了,想不吃不喝去啃他人代码的机会都没……
那么,问题就来了,怎么办???SpringAOP 就呈现了
1. SpringAOP 的解决方案
比方上图所示,须要扩大的是 A 对象的 testA() 办法。SpringAOP 的具体解决思路:
- 为咱们创立了同样实现 C 接口的 B 对象;
- 在对象 B 中申明扩大前的接口属性和扩大后的接口属性
- 在对象 B 中申明接口 C 的属性
- 重写要扩大的办法
- 在重写的办法中调用扩大前的办法和原有的办法以及扩大后的办法
- 将 B 类配置为 Bean 对象,并依照规定组装 A 和 E、F
2. SpringAOP 的 SchemaBase 形式实现
2.1 基本思路
咱们将要进行性能扩大相干的资料以及对应的组织规定通知 Spring 容器,Spring 容器帮咱们动态创建一个代理对象。咱们间接从 Spring 容器中获取代理对象实现性能开发。
2.1 具体实现
2.1.1 导入 Jar 包
2.1.2 在 src 下创立包 advice, 并创立前置告诉类和后置告诉类
前置告诉类:
创立一个一般的 java 类,实现 MethodBeforeAdvice 接口,重写 before 办法,在 before 办法中申明扩大前的逻辑代码。
后置告诉类:
创立一个一般的 Java 类,实现 AfterReturningAdvice 接口,重写 after 办法,并在 after 办法中申明扩大后的逻辑代码。
2.1.3 在 applicationcontext.xml 文件中配置资源的 bean 对象以及申明组装规定
资源对象:
- 要进行性能扩大的 bean 对象
- 前置告诉的 bean 对象
- 后置告诉的 bean 对象
申明组装规定:(应用 AOP 标签实现)
- 申明切点
- 申明组装
2.1.4 从 Spring 容器中间接获取代理对象实现性能开发
留神:如果让 Spring 容器对象某个 bean 对象依照 AOP 进行性能扩大,则从 Spring 容器中应用该对象的 ID 获取的对象曾经不是其自身了,而是他的代理对象
3.SpringAOP 的业余概念
- 实在对象:
要进行性能扩大的对象, 相当于 A 对象
- 代理对象:
实现性能扩大的对象, 相当于 B 对象.
- 切点:
要进行性能扩大的办法, 相当于 testA() 办法
- 前置告诉办法:
在切点之前执行的扩大办法
- 后置告诉办法:
在切点之后执行的扩大办法
- 切面:
由前置告诉 + 切点 + 后置告诉造成的横向执行的面
- 织入:
由前置告诉 + 切点 + 后置告诉造成切面的过程
- AOP 的概念:
面向切面的编程