详解Spring框架的AOP机制
AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。本篇结合实际案例详细讲述AOP的原理及实现过程。通过本篇的学习,可以达成如下目标。
● 理解AOP的编程思想及原理
● 掌握AOP的实现技术
Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。
例如,在一个业务系统中,用户登录是基础功能,凡是涉及到用户的业务流程都要求用户进行系统登录。如果把用户登录功能代码写入到每个业务流程中,会造成代码冗余,维护也非常麻烦,当需要修改用户登录功能时,就需要修改每个业务流程的用户登录代码,这种处理方式显然是不可取的。比较好的做法是把用户登录功能抽取出来,形成独立的模块,当业务流程需要用户登录时,系统自动把登录功能切入到业务流程中。下图是用户登录功能切入到业务流程示意图。
图1 用户登录功能切入到业务流程示意图
1、 一个AOP案例描述
在课程案例SpringProgram项目中,一个业务流程是校长通过邮件发送上课通知给老师。校长执行该业务时,业务系统并没有对老师进行验证。现在要求校长在发送通知之前,需要对老师进行用户验证。
具体要求是在尽量不改变原有业务代码的情况下,加入老师验证功能。原有业务代码如下。
EmailNotice业务类代码没有对老师身份进行验证,可以考虑在执行setTeacher方法之前执行验证功能。
具体的操作步骤是:
(1)添加老师身份验证功能代码,用于切入到EmailNotice业务类,身份验证功能代码也称为切面,切入点为EmailNotice业务类的setTeacher方法;
(2)在Spring配置文件中配置AOP,添加切入面、切入点以及需要切入的目标Bean;
(3)编写测试代码,测试程序运行地正确性。
2、 实现AOP案例代码
在实现AOP案例之前,需要确定项目已经引入了Spring框架关于AOP功能的Jar包。下面列出的是spring-aop-5.0版本,其它版本也可以。
● spring-aop-5.0.8.RELEASE
● spring-aspects-5.0.8.RELEASE
另外还需要引入下面的Jar包:
● aspectjrt
● aspectjweaver
在课程案例SpringProgram项目中,相关的Teacher实体类、EmailNotice业务类、Spring配置文件已经存在,为了不影响前面课程的案例。实现AOP的代码重新编写AopTeacher实体类、AopEmailNotice业务类以及Spring配置文件。
(1)添加AopTeacher实体类
在课程案例SpringProgram项目中,添加AopTeacher实体类。
(2)添加老师身份验证功能
在课程案例SpringProgram项目中,添加VerifyUser类,并添加类方法beforeAdvice,该方法需要传入AopTeacher实体类,用于验证老师身份的合法性。
(3)添加AopEmailNotice业务类
在课程案例SpringProgram项目中,添加AopEmailNotice业务类。
AopEmailNotice业务类内置了AopTeacher对象,并通过sendMessage方法发送通知给AopTeacher对象。setTeacher方法用于设置AopTeacher对象,在设置之前需要验证AopTeacher对象身份的合法性,也就是要在setTeacher方法执行之前,执行VerifyUser类的beforeAdvice方法。
(4)添加Spring配置文件
在课程案例SpringProgram项目中,添加Spring配置文件aop.xml。
aop.xml需要使用AOP命名空间,因此需要在配置文件中导入spring-aop架构,添加下面的AOP命名空间。
标签用于AOP创建代理切入类(代理类)是基于接口的还是基于类的,如果proxy-target-class 属性值被设置为true,那么创建基于类的代理,否则创建基于接口的代理。
标签用于配置AOP。其中子标签添加一个切面Aspect,一个切面可以是一个模块或一个类。例如验证用户身份的VerifyUser类,该切面将被AOP调用。可以配值多个切面。
标签用于声明一个切入点,也就是切面提供的哪些方法可以被调用。expression 为切入点的表达式,用于定义切入点的路径。
例如:
execution(* com.milihua.springprogram.notice.AopEmailNotice.setTeacher(..))
上述表达式的意思是切入点为AopEmailNotice的setTeacher方法。其中*号表示切入点为任意的返回类型,(..)表示任意参数。
再如:
execution(* com.milihua.springprogram.notice. .*.*(..))
上述表达式的意思是切入点为com.milihua.springprogram.notice包及子包下所有的类及类中所有的方法。
又如:
execution(* com.milihua.springprogram.notice. *.*(..))
上述表达式的意思是切入点为com.milihua.springprogram.notice包下所有的类及类中所有的方法。
(5)编写测试代码
在课程案例SpringProgram项目中,添加AopTest测试类。
测试程序运行结果如下图所示。
3、AOP编程思想及术语
AOP是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。
例如,前面案例的VerifyUser类就是切面,VerifyUser类的beforeAdvice就是关注点。VerifyUser切面的功能就是验证老师身份,可以应用到与老师相关的不同业务流程中。AopEmailNotice是一个业务类,负责发送通知给老师,在发送通知之前需要验证老师的身份。AOP会在AopEmailNotice类的setTeacher方法执行之前,将beforeAdvice关注点切入到AopEmailNotice业务类中,并执行beforeAdvice方法。
Spring框架提供了@AspectJ 注解方法和基于XML架构的方法来实现AOP。前面的案例是基于XML架构的方法,后面一节会讲述基于@AspectJ 注解的方法。下面结合前面的案例讲述一下AOP的相关术语。
● Aspect
表示切面。切入业务流程的一个独立模块。例如,前面案例的VerifyUser类,一个应用程序可以拥有任意数量的切面。
● Join point
表示连接点。也就是业务流程在运行过程中需要插入切面的具体位置。例如,前面案例的AopEmailNotice类的setTeacher方法就是一个连接点。
● Advice
表示通知。是切面的具体实现方法。可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)五种。实现方法具体属于哪类通知,是在配置文件和注解中指定的。例如,VerifyUser类的beforeAdvice方法就是前置通知。
● Pointcut
表示切入点。用于定义通知应该切入到哪些连接点上,不同的通知通常需要切入到不同的连接点上。例如,前面案例配置文件的<aop:pointcut>标签。
● Target
表示目标对象。被一个或者多个切面所通知的对象。例如,前面案例的AopEmailNotice类。
● Proxy
表示代理对象。将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象为目标对象的业务逻辑功能加上被切入的切面所形成的对象。
● Weaving
表示切入,也称为织入。将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期。
课程小结
(1)本篇探讨了AOP的编程思想,其主要思想是让开发者把诸多业务流程中的通用功能抽取出来,单独编写功能代码,形成独立的模块,这些模块也被称为切面。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把切面切入到流程的合适位置。
(2)本篇也通过案例讲述了AOP的实现过程,具体实现步骤是:首先编写需要切入业务流程的独立模块(也称为切面)和切入点(模块中的方法);然后在Spring配置文件中配置AOP,添加切入面、切入点以及需要切入的目标Bean;最后编写测试代码。
详解Spring框架的AOP机制相关推荐
- 多图详解Spring框架的设计理念与设计模式
Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的JDBC应用做过报道.本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的 ...
- 详解Spring框架的异步请求
文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...
- 详解spring框架入门到精通
spring概述 spring框架的优点 spring框架的组成 spring核心IOC IOC概述 IOC入门案例 创建maven jar工程 引入spring的依赖 引入spring的核心配置文件 ...
- Java扫描配置文件的注解_详解Spring框架注解扫描开启之配置细节
前言 Spring框架对Bean进行装配提供了很灵活的方式,下面归纳一下主要的方式: 在XML中进行显示配置 在Java中进行显示配置 隐式的bean发现机制和自动装配 而自动装配实现就需要注解扫描, ...
- 详解Spring框架的依赖注入
本篇主要介绍Spring的依赖注入.依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性.通过本篇的学习,可以达 ...
- 详解 Spring 框架的依赖注入
本篇主要介绍 Spring 的依赖注入.依赖注入是 Spring 协调不同 Bean 实例之间的合作而提供的一种工作机制,在确保 Bean 实例之间合作的同时,并能保持每个 Bean 的相对独立性.通 ...
- java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验
why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...
- Spring框架学习教程,详解Spring注入bean的几种方式
首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...
- 详解spring的IOC控制反转和DI依赖注入
转载 详解spring的IOC控制反转和DI依赖注入 2018-06-05 15:45:34 jiuqijack 阅读数 2945 文章标签: spring IOC控制反转 DI依赖注入 更多 分类专 ...
最新文章
- apache开启虚拟主机localhost无法访问
- IIS 6.0曝远程代码执行漏洞 安全狗可拦截
- 强烈推荐!大数据领域的顶级开源工具大集合
- WES 7 FBWF灾难性故障
- 计算机技术对审计范围的影响,计算机技术对审计过程的影响分析
- Python绘图——RGB颜色对照表
- week 5 session and cookie
- sentinel.conf样例
- css里dotted,CSS中dashed和dotted的区别有哪些
- 极限、微分、积分 必会公式总结
- .Net6.0系列-6 .Net 6LinQ(二)常用扩展方法
- Flume采集数据利器
- 修改 nginx 的默认端口
- 二维数组作为函数参数的传递
- JVM上篇_15-垃圾回收相关算法_尚硅谷
- Windows Media Player 无法播放
- Windows7下网上银行U盾无法使用的解决办法
- 硬件设计——BUCK电路仿真设计
- MATLAB中的共轭转置与转置
- Linux加载vmlinux调试