标签:Spring AOP 切面 模块 pattern execution 表达式
这里写目录标题
前言
项目中除了纵向的业务逻辑线外,通常我们还需要处理一些模块共用的逻辑,比如权限认证、性能统计等。这些逻辑通常是‘横向’的,贯穿多个业务模块。这时候 AOP 就派上用场了。
一、AOP 简单介绍
面向切面编程,简称 AOP(Aspect Oriented Programming)。是指将切面逻辑按一定的方式织入到特定的业务模块中,从而在执行业务逻辑的过程的同时完成切面逻辑。
AOP 主要的组成
切面: 指定切面应该织入的业务模块范围
切面逻辑: Advice, 切面需要实现的功能
AOP 的主要类型
类型 | 说明 |
---|---|
@Before | 切面逻辑在业务模块代码执行之前执行,其不能阻止业务模块的执行,除非抛出异常 |
@AfterReturning | 切面逻辑在业务模块代码执行之后执行 |
@AfterThrowing | 切面逻辑在业务模块抛出指定异常后执行 |
@After | 切面逻辑在所有的 Advice 执行完成后执行,无论业务模块是否抛出异常,类似于finally的作用 |
@Around | 切面逻辑包裹业务模块的执行,其可以传入一个 ProceedingJoinPoint 用于调用业务模块的代码,调用前逻辑和调用后逻辑都可以在该方法中编写,也可以根据一定的条件阻断业务模块的调用 |
@DeclareParents | 在属性声明上使用,主要用于为指定的业务模块添加新的接口和相应的实现 |
二、Spring AOP 表达式
示例
@Aspect
public class MyAspect {
@Around("{切面表达式}")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("this is before around advice");
Object result = pjp.proceed();
System.out.println("this is after around advice");
return result;
}
}
声明切面类
@Aspect 注解用在类声明上,指明当前类是一个组织了切面逻辑的类,并且该注解中可以指定当前类是何种实例化方式,主要有三种:singleton、perthis和pertarget
切面表达式
execution
execution 表达式可以指定方法返回类型,类名,方法名和参数名等与方法相关的部件。Spring 中大部分需要使用 AOP 的业务场景达到方法级别即可,因此 execution 表达式的使用是最为广泛的。如下是 execution 表达式的语法:
modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?
表达式项说明(问号表示当前项可选):
表达式项 | 说明 |
---|---|
modifiers-pattern | 方法的可见性,如public,protected |
ret-type-pattern | 方法的返回值类型,如int,void等 |
declaring-type-pattern | 方法所在类的全路径名,如com.spring.Aspect |
name-pattern | 方法名类型,如buisinessService() |
param-pattern | 方法的参数类型,如java.lang.String |
throws-pattern | 方法抛出的异常类型,如java.lang.Exception |
通配符
表达式项中可以使用通配符实现批量匹配,类似于正则表达式的使用。
*
通配符,用于匹配单个单词,或者是以某个词为前缀或后缀的单词。
//表示返回值为任意类型,com.spring.service.BusinessObject类中参数个数为零的所有方法
execution(* com.spring.service.BusinessObject.*())
//表示返回值为任意类型,在com.spring.service包中,以Business为开头的类中参数个数为零方法:
execution(* com.spring.service.Business*.*())
//表示匹配返回值为任意类型,并且是com.spring.service包及其子包下的任意类的名称为businessService的方法,而且该方法不能有任何参数
execution(* com.spring.service..*.businessService())
..
通配符,表示0个或多个项,主要用于declaring-type-pattern
和param-pattern
中
如果用于 declaring-type-pattern 中,则表示匹配当前包及其子包,
如果用于 param-pattern 中,则表示匹配0个或多个参数。
//使用..表示任意个数的参数,需要注意,表示参数的时候可以在括号中事先指定某些类型的参数,而其余的参数则由..进行匹配:
execution(* com.spring.service.BusinessObject.businessService(java.lang.String,..))
within
args
this 和 target
标签:Spring,AOP,切面,模块,pattern,execution,表达式 来源: https://blog.csdn.net/weixin_39340061/article/details/113529361
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。