重学Spring笔记(二)——SpringAOP

0. 问题引入

实际生产环境中,存在着在现有运行项目功能的业务逻辑上,需要拓展新增业务功能的情况,此时大概率我们改的项目不是我们开发的,有可能存在以下问题:

  1. 有项目源代码:此时需要费时费力去阅读原来的源代码,弄懂有可能较为复杂的业务逻辑,然后再来新增业务代码。可是……看懂代码可能需要一周,但领导要求三天搞定………………
  2. 项目久远已无源代码:此时真是头大了,想不吃不喝去啃别人代码的机会都没……

那么,问题就来了,怎么办???SpringAOP就出现了

1. SpringAOP的解决方案

重学Spring笔记(二)——SpringAOP_第1张图片

比如上图所示,需要扩展的是A对象的testA()方法。SpringAOP的具体解决思路:

  1. 为我们创建了同样实现C接口的B对象;
  2. 在对象B中声明扩展前的接口属性和扩展后的接口属性
  3. 在对象B中声明接口C的属性
  4. 重写要扩展的方法
  5. 在重写的方法中调用扩展前的方法和原有的方法以及扩展后的方法
  6. 将B类配置为Bean对象,并按照规则组装A和E、F

2. SpringAOP的SchemaBase方式实现

2.1 基本思路

我们将要进行功能扩展相关的材料以及对应的组织规则告诉Spring容器,Spring容器帮我们动态创建一个代理对象。我们直接从Spring容器中获取代理对象完成功能开发。

2.1 具体实现

2.1.1 导入Jar包

重学Spring笔记(二)——SpringAOP_第2张图片

2.1.2 在src下创建包advice,并创建前置通知类和后置通知类

前置通知类:
创建一个普通的java类,实现MethodBeforeAdvice接口,重写before方法,在before方法中声明扩展前的逻辑代码。
重学Spring笔记(二)——SpringAOP_第3张图片

后置通知类:
创建一个普通的Java类,实现AfterReturningAdvice接口,重写after方法,并在after方法中声明扩展后的逻辑代码。
重学Spring笔记(二)——SpringAOP_第4张图片

2.1.3 在applicationcontext.xml文件中配置资源的bean对象以及声明组装规则

资源对象:

  1. 要进行功能扩展的bean对象
  2. 前置通知的bean对象
  3. 后置通知的bean对象

声明组装规则:(使用AOP标签完成)

  1. 声明切点
  2. 声明组装

重学Spring笔记(二)——SpringAOP_第5张图片

2.1.4 从Spring容器中直接获取代理对象完成功能开发

重学Spring笔记(二)——SpringAOP_第6张图片

注意:如果让Spring容器对象某个bean对象按照AOP进行功能扩展,则从Spring容器中使用该对象的ID获取的对象已经不是其本身了,而是他的代理对象

3.SpringAOP的专业概念

  • 真实对象:

要进行功能扩展的对象,相当于A对象

  • 代理对象:

完成功能扩展的对象,相当于B对象.

  • 切点:

要进行功能扩展的方法,相当于testA()方法

  • 前置通知方法:

在切点之前执行的扩展方法

  • 后置通知方法:

在切点之后执行的扩展方法

  • 切面:

由前置通知+切点+后置通知形成的横向执行的面

  • 织入:

由前置通知+切点+后置通知形成切面的过程

  • AOP的概念:

面向切面的编程

你可能感兴趣的:(java,spring,aop)