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

切入点表达式的作用:限制连接点的匹配(满足时对应的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. zz——Recent Advances on Object Detection in MSRA

    本文由DataFun社区根据微软亚洲研究院视觉组Lead Researcher Jifeng Dai老师在2018 AI先行者大会中分享的<Recent Advances on Object D ...

  2. 在分页中,删除操作后,AJAX重载刷新当前页

    需求 分页中,在 删除 和 编辑 完成后,AJAX重载刷新 当前页 ,而不是跳转到 第一页 实现步骤 添加两个的 input 控件,用来存储 当前页数 和 记录总条数(非必须,能有方法获取到这两个值即 ...

  3. echarts的markline的使用 y轴预警线

    代码示例: app.title = '坐标轴刻度与标签对齐'; option = { color: ['#3398DB'], tooltip : { trigger: 'axis', axisPoin ...

  4. oracle--BBED (dump 深入实践三)

    一,工具介绍 bbed是Block Browser and Editor(块浏览编辑器)的缩写,它是Oracle数据库在安装时一起附带的工具. 一般此工具倾向于仅作为Oracle内部使用,且Oracl ...

  5. 在 Queue 中 poll()和 remove()有什么区别?

    remove() ,如果队列为空的时候,则会抛出异常 而poll()只会返回null    

  6. Consul 使用手册(感觉比较全了)

    HTTP API consul的主要接口是RESTful HTTP API,该API可以用来增删查改nodes.services.checks.configguration.所有的endpoints主 ...

  7. 用Autofac替换.net core 内置容器

    官方建议使用内置容器,但有些功能并不支持,如下: 属性注入 基于名称的注入 子容器 自定义生存期管理 Func<T> 支持 所以可以使用其他第三方IOC容器,如Autofac,下面为学习使 ...

  8. Supervisor-守护进程工具

    前言 手头上的服务器程序1.0版本终于要进入线上测试阶段了

  9. 【记录】【idea】【mysql】Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.解决问题

    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property ...

  10. SQL --------------- GROUP BY 函数

    Aggregate 函数常常需要添加 GROUP BY 语句,Aggregate函数也就是常说的聚和函数,也叫集合函数 GROUP BY语句通常与集合函数(COUNT,MAX,MIN,SUM,AVG) ...