ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring AOP 表达式记录

2021-02-02 21:05:46  阅读:30  来源: 互联网

标签: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-patternparam-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

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有