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的概念:
面向切面的编程