Spring Aop的注解简记

Aop

Aop 为 Aspect Oriented Programming 的缩写,即面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。他通过对已有程序定一个切入点,然后在其前后切入不同的执行内容。比如常见的有:打开数据库连接/关闭数据库连接、打开事务/关闭事务、记录日志等。基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


注解

  • @Aspect(切面):把当前类标识为一个切面类供容器读取
  • @Before:标识一个前置增强方法,,相当于BeforeAdvice
  • @After:不管是抛出异常或者正常退出都会执行
  • @AfterThrowing:异常抛出增强,相当于ThrowsAdvice
  • @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
  • @Around:环绕增强,相当于MethodInterceptor
  • @DeclareParents:引介增强,相当于IntroductionInterceptor
  • @Pointcut(切点):切面类中负责增强的方法,在实际操作中,实际负责增强的方法叫切入点。常与execution表达式一起用
  • JoinPoint(连接点):类里面的被增强的方法
  • @Order:一个 web 应用会配置多个切面,所以这时就有了先后顺序。@Order(value = )注解中的值越小优先级越高。执行顺序是这样的:
    • @Before中优先执行@Order(5)的内容,再执行@Order(10)的内容
    • @After@AfterReturning中优先执行@Order(10)的内容,再执行@Order(5)的内容

execution 切点函数

语法为:

execution( 方法修饰符(可选) 返回类型 方法名 参数 异常模式(可选) )

execution(public * nuc.jyg.chapter9.controller.UserController.*(..))

  • 参数部分允许使用通配符:
    • * 匹配任意字符,但只能匹配一个元素`(*)``
    • ``.. 匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用。+必须跟在类名后面,如User+`,表示类本身和继承或扩展指定类的所有类

所以以上表达式可以解析为:

名称 意义
方法修饰符 public
返回类型 *匹配任意数量字符,表示返回类型不限
方法名 nuc.jyg.chapter9.controller.UserController.*表示匹配UserController类下的所有方法
参数 (..)表示匹配任意数量和类型的输入参数
异常模式 不限

更多示例:

void aop(String,int)

匹配目标类任意修饰符方法、返回void、方法名aop、带有一个String和一个int型参数的方法

public void aop(*)

匹配目标类public修饰、返回void、方法名aop、带有一个任意类型参数的方法

public String *o*(..)

匹配目标类public修饰、返回String类型、方法名中带有一个o字符、带有任意数量任意类型参数的方法

public void *o*(String,..)

匹配目标类public修饰、返回void、方法名中带有一个o字符、带有任意数量任意类型参数,但第一个参数必须有且为String型的方法

也可以指定类:

public void nuc.jyg.chapter9.controller.UserController.*(..)

匹配UserControllerpublic修饰、返回void、不限方法名、带有任意数量任意类型参数的方法

public void void nuc.jyg.chapter9.controller.*Controller.*(..)

匹配以Controller结尾的类中public修饰、返回void、不限方法名、带有任意数量任意类型参数的方法

指定包:

public void nuc.jyg.chapter9.controller.*.aop(..)

匹配nuc.jyg.chapter9.controller包下所有类中public修饰、返回void、方法名aop、带有任意数量任意类型参数的方法

public void nuc.jyg..*.aop(..)

匹配nuc.jyg.包下和所有子包中的类中public修饰、返回void、方法名aop、带有任意数量任意类型参数的方法


更多切点函数

除了execution(),Spring 中还支持其他多个函数,这里列出名称和简单介绍,以方便根据需要进行更详细的查询

  1. annotation()

表示标注了指定注解的目标类方法

例如@annotation(org.springframework.transaction.annotation.Transactional) 表示标注了@Transactional的方法

  1. args()

通过目标类方法的参数类型指定切点

例如args(String)表示有且仅有一个String型参数的方法

  1. @args()

通过目标类参数的对象类型是否标注了指定注解指定切点

@args(org.springframework.stereotype.Service)表示有且仅有一个标注了@Service的类参数的方法

  1. within()

通过类名指定切点

with(nuc.jyg.chapter9.controller.UserController)表示UserController的所有方法

  1. target()

通过类名指定,同时包含所有子类

target(nuc.jyg.chapter9.controller.UserController)ManController extends UserController,则两个类的所有方法都匹配

  1. @within()

匹配标注了指定注解的类及其所有子类

@within(org.springframework.web.bind.annotation)UserController加上@RestController标注,则UserControllerManController 的所有方法都匹配

  1. @target()

所有标注了指定注解的类

@target(org.springframework.stereotype.Service)表示所有标注了@Service的类的所有方法

  1. this()

大部分时候和target()相同,区别是this是在运行时生成代理类后,才判断代理类与指定的对象类型是否匹配


逻辑运算符

表达式可由多个切点函数通过逻辑运算组成

&&

与操作,求交集,也可以写成and

例如execution(* aop(..)) && target(User)表示User及其子类的aop方法

||

或操作,求并集,也可以写成or

例如execution(* aop(..)) || args(String)表示名称为aop的方法或者有一个String型参数的方法

!

非操作,求反集,也可以写成not

例如execution(* aop(..)) and !args(String)表示名称为aop的方法但是不能是只有一个String型参数的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译阶段对程序进行修改,即实现...
    数独题阅读 2,367评论 0 22
  • 前几日抵达天河机场,因为暴雨大量航班延误。我们从一楼抵达准备出港,二楼出发厅传来一整整吵闹声,不用...
    枝子05阅读 1,067评论 1 1
  • 虽然,只是个普通玩家,虽然带了一点青春,一点爱。虽然,有那么些怀念 ~ 好吧,不浪费篇幅伪伪的煽情,直插主题吧。 ...
    大P阅读 11,923评论 8 22