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的概念:
面向切面的编程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。