一、切入点表达式的各种类型

切入点表达式的作用:限制连接点的匹配(满足时对应的aspect方法会被执行)

1)execution:用于匹配方法执行连接点。Spring AOP用户可能最经常使用execution切入点指示器

执行表达式的格式如下:

  execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

    modifiers-pattern 指定访问修饰符如public

    ret-type-pattern 指定返回类型如void;*是最常用的返回类型模式。它匹配任何返回类型
    declaring-type-pattern 指定类的全路径名称如com.zbq.springbootdemo.Myservice;如果指定了,通过 . 符号将其连接到name-pattern
    name-pattern 指定方法名称如get;您可以使用*通配符作为名称模式的全部或部分
    param-pattern 指定参数类型如String;()匹配不带参数的方法,而(..)匹配任意数量(零或更多)的参数。(*)模式匹配接受任意类型参数的方法;(*,String)匹配一个带有两个参数的方法。第一个可以是任何类型,第二个必须是字符串
    throws-pattern 指定抛出的异常类型
  除了返回类型模式(前面代码段中的rt-type-pattern)、name-pattern和param-pattern之外,其他所有部分都是可选的。

AspectJ类型匹配的通配符:·

*:匹配任何数量字符;

..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。

+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。

java.lang.String    匹配String类型;  
java.*.String       匹配java包下的任何“一级子包”下的String类型;  
            如匹配java.lang.String,但不匹配java.lang.ss.String  
java..*            匹配java包及任何子包下的任何类型;  
                   如匹配java.lang.String、java.lang.annotation.Annotation  
java.lang.*ing      匹配任何java.lang包下的以ing结尾的类型;  
java.lang.Number+  匹配java.lang包下的任何Number的自类型;  
                   如匹配java.lang.Integer,也匹配java.math.BigInteger 
 // 执行任何公用方法
@Pointcut("execution(public * *(..))")
private void pointcut1() {
} // 任何以set开头的方法的执行:
@Pointcut(" execution(* set*(..))")
private void pointcut2() {
} // 执行MyService接口定义的任何方法:
@Pointcut("execution(* com.zbq.springbootdemo.service.MyService.*(..))")
private void pointcut3() {
} // 执行service包中定义的任何方法
@Pointcut("execution(* com.zbq.springbootdemo.service..*(..))")
private void pointcut4() {
} // 执行service包及其子包中定义的任何方法
@Pointcut("execution(* com.zbq.springbootdemo.service..*.*(..))")
private void pointcut5() {
}

2)within:用于匹配指定类型内的方法执行,限制对某些类型的匹配即满足指定的条件类,使用Spring AOP时匹配的类型中声明的方法被执行。和execution不一样的是,execution针对的是方法而within针对的是类

// 指定具体类中定义的任何方法
@Pointcut("within(com.zbq.springbootdemo.service.MyService)")
private void pointcut6_1() {
} // 执行service包中定义的任何方法
@Pointcut("within(com.zbq.springbootdemo.service.*)")
private void pointcut6() {
} // 执行service包及其子包中定义的任何方法
@Pointcut("within(com.zbq.springbootdemo.service..*)")
private void pointcut7() {
}

3)this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配

// 代理实现MyService接口的任何连接点(仅在Spring AOP中执行方法):
@Pointcut("this(com.zbq.springbootdemo.service.MyService)")
private void pointcut8() {
}

4)target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配

  // 目标对象实现MyService接口的任何连接点(仅在Spring AOP中执行方法)
@Pointcut("target(com.zbq.springbootdemo.service.MyService)")
private void pointcut9() {
}

5)args:用于匹配当前执行的方法传入的参数为指定类型的执行方法·

 // 任何接受单个参数的连接点(只有在Spring AOP中才执行方法),并且在运行时传递的参数是可序列化的:
// 注意和execution(* *(java.io.Serializable))区分开,args(java.io.Serializable)表示在运行时传递的参数是可序列化的,后者表示参数是Serializable类型的
@Pointcut("args(java.io.Serializable)")
private void pointcut10() {
}

6)@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解

// 目标对象具有@MyAnnotation注释的任何连接点(仅在Spring AOP中执行方法):
@Pointcut("@target(com.zbq.springbootdemo.common.annotation.MyAnnotation))")
private void pointcut11() {
}

7)@args:用于匹配当前执行的方法传入的参数持有指定注解的执行

// 任何接受单个参数的连接点(仅在Spring AOP中执行方法),其中传递的参数的运行时类型有@classification注解:
@Pointcut("@args(com.xyz.security.Classified)")
private void pointcut14() {
}

8)@within:用于匹配所有持有指定注解类型内的方法,作用和@target类似

// 目标对象的声明类型具有@Transactional注释的任何连接点(仅在Spring AOP中执行方法):
@Pointcut("@within(com.zbq.springbootdemo.common.annotation.MyAnnotation)")
private void pointcut12() {
}

9)@annotation:用于匹配当前执行方法持有指定注解的方法

// 任何连接点(仅在Spring AOP中执行方法),其中执行方法具有@MyAnnotation注解:
@Pointcut("@annotation(com.zbq.springbootdemo.common.annotation.MyAnnotation)")
private void pointcut13() {
}
// 指定注解并获取注解值,指定名称就行
@Pointcut(value = "execution(* com.zbq.springbootdemo.service.MyService..*(..)) && @annotation(myAnnotation)")
public void myPointcut4(MyAnnotation myAnnotation) {
}

10)bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法

 // 在名为tradeService的Spring bean上的任何连接点(仅在Spring AOP中执行方法):
@Pointcut("bean(tradeService)")
private void pointcut15() {
} // 在具有匹配通配符表达式*Service的名称的Spring bean上的任何连接点(仅在Spring AOP中执行方法):
@Pointcut("bean(*Service)")
private void pointcut16() {
}

二、切入点表达式的使用

1)命名切入点可以被其他切入点引用,而匿名切入点是不可以的

   @Pointcut("execution(* com.zbq.springbootdemo.service.MyService.*(..))")
public void myPointcut() {
}
@Before("myPointcut()")
public void before() {
log.info("before ");
}

2)可以使用&&、||和!组合切入点表达式。您还可以通过名称引用切入点表达式。下面的例子展示了三个切入点表达式

   /** 可以使用&&、||和!组合切入点表达式。您还可以通过名称引用切入点表达式。下面的例子展示了三个切入点表达式: */
/**
* 任何公共方法
*/
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {
} /**
* springbootdemo包及其子包的所有方法
*/
@Pointcut("within(com.zbq.springbootdemo..*)")
private void inTrading() {
} @Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {
}

3)将新的接口(和相应的实现)引入任何被建议的对象

 @DeclareParents(value="com.zbq.springbootdemo.service..*", defaultImpl=MyOperationManager.class)
public static MyOperation myOperation; @After("execution(* com.zbq.springbootdemo.service.MyService.*(..)) && this(myOperation)" )
public void after(JoinPoint joinPoint, MyOperation myOperation) {
myOperation.operation();
log.info("after ");
}
// 原本的对象就可以强转为指定的接口
MyOperation myOperation = (MyOperation) context.getBean("myService");

  

【Spring AOP】Spring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇(3)的更多相关文章

  1. spring schedule定时任务(一):注解的方式

    我所知道的java定时任务的几种常用方式: 1.spring schedule注解的方式: 2.spring schedule配置文件的方式: 3.java类继承TimerTask: 第一种方式的实现 ...

  2. Spring中Bean的配置:基于注解的方式

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: -@Component:基本注解,标识一个受Spring管理的组件 -@Respositor ...

  3. Spring MVC通过Pageable对象和PageableDefault注解获取分页信息(MongoDB通过Pageable来操作分页)

    说明:Pageable同时也能用于操作MongoDB的分页. PageableSpring Data库中定义的一个接口,该接口是所有分页相关信息的一个抽象,通过该接口,我们可以得到和分页相关所有信息( ...

  4. spring中aop的注解实现方式简单实例

    上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...

  5. 使用Spring框架入门四:基于注解的方式的AOP的使用

    一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...

  6. Spring AOP: Spring之面向方面编程

    Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...

  7. JAVA框架 Spring AOP--切入点表达式和通知类型

    一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...

  8. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

    一.spring aop execution表达式说明 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义 ...

随机推荐

  1. LeetCode 102. Binary Tree Level Order Traversal02. 二叉树的层次遍历 (C++)

    题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...

  2. 洛谷 P2357 守墓人

    洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...

  3. 使用arthas 生成火焰图分析jvm

    arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习 项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问 ...

  4. Linux性能优化实战学习笔记:第三十八讲

    一.上节回顾 上一节,我们学习了 DNS 性能问题的分析和优化方法.简单回顾一下,DNS 可以提供域名和 IP 地址的映射关系,也是一种常用的全局负载均衡(GSLB)实现方法. 通常,需要暴露到公网的 ...

  5. [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  6. SpringBoot集成Spring Security(6)——登录管理

    文章目录 一.自定义认证成功.失败处理 1.1 CustomAuthenticationSuccessHandler 1.2 CustomAuthenticationFailureHandler 1. ...

  7. Java 获取所有子类信息

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...

  8. 使用Shell上传/下载文件

    来源:https://www.cnblogs.com/pcyy/p/7568820.html 1,安装lrzsz工具包 yum  install lrzsz 2,安装完成后 输入rz选择文件进行上传

  9. pandas的使用(7)--分组

    pandas的使用(7)--分组

  10. pymysql模块常用操作

    pymysql安装 pip install pymysql 链接数据库.执行sql.关闭连接 import pymysql user = input('请输入用户名请输入密码:').strip() p ...