Aspect Oriented Programing 面向切面编程,相比较 oop 面向对象编程来说,Aop 关注的不再是程序代码中某个类,某些方法,而 aop 考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。联想大家吃的汉堡(中间夹肉)。那么 aop 是怎么做到拦截整个面的功能呢?考虑学到的 servlet urlpattern /* 的配置,实际上也是 aop 的实现 。
Spring Aop 实现的方式
- 注解 方式
- XML 方式
案例实操
注解方式
jar 包坐标引入
1 | xml复制代码<dependency> |
beans.xml 配置
添加命名空间
1 | xml复制代码xmlns:aop="http://www.springframework.org/schema/aop" |
1 | xml复制代码http://www.springframework.org/schema/aop |
配置 Aop 代理
1 | xml复制代码<aop:aspectj-autoproxy/> |
编写 aop 实现类
1 | java复制代码/** |
Aop 匹配方法规则表达式语言(简要了解)
Aop 切入点表达式简介
执行任意公共方法:
1 | java复制代码execution(public *(..)) |
执行任意的 set 方法
1 | java复制代码execution(* set*(..)) |
执行 com.xxx.service 包下任意类的任意方法
1 | java复制代码execution(* com.xxx.service.*.*(..)) |
执行 com.xxx.service 包 以及子包下任意类的任意方法
1 | java复制代码execution(* com.xxx.service..*.*(..)) |
xml 方式
配置切面、切入点、通知
1 | xml复制代码<!-- aop 相关配置 --> |
定义 bean
1 | java复制代码/** |
扩展
AOP 的基本概念
JoinPoint(连接点)【动态】
被拦截到的每个点,spring 中指被拦截到的每一个方法,spring aop 一个连接点即代表一个方法的执行。
Pointcut(切入点)【静态】
对连接点进行拦截的定义(匹配规则定义 规定拦截哪些方法,对哪些方法进行处理),spring 这块有专门的表达式语言定义。
Advice(通知){重点}
拦截到每一个连接点即(每一个方法)前后所要做的操作
- 前置通知(前置增强)–before() 执行方法前通知
- 返回通知(返回增强)–afterReturning 方法正常结束返回后的通知
- 异常抛出通知(异常抛出增强)–afetrThrow()
- 最终通知 –after 无论方法是否发生异常,均会执行该通知
- 环绕通知 –around 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行
Aspect(切面)
切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的 哪些方法,通知则定义了拦截方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
Target(目标对象)
被代理的目标对象
Weave(织入)
将切面应用到目标对象并生成代理对象的这个过程即为织入(过程)。
Introduction(引入)
在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入。
本文转载自: 掘金