【Spring AOP】Spring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇(3)
一、切入点表达式的各种类型
切入点表达式的作用:限制连接点的匹配(满足时对应的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)的更多相关文章
- spring schedule定时任务(一):注解的方式
我所知道的java定时任务的几种常用方式: 1.spring schedule注解的方式: 2.spring schedule配置文件的方式: 3.java类继承TimerTask: 第一种方式的实现 ...
- Spring中Bean的配置:基于注解的方式
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: -@Component:基本注解,标识一个受Spring管理的组件 -@Respositor ...
- Spring MVC通过Pageable对象和PageableDefault注解获取分页信息(MongoDB通过Pageable来操作分页)
说明:Pageable同时也能用于操作MongoDB的分页. PageableSpring Data库中定义的一个接口,该接口是所有分页相关信息的一个抽象,通过该接口,我们可以得到和分页相关所有信息( ...
- spring中aop的注解实现方式简单实例
上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...
- 使用Spring框架入门四:基于注解的方式的AOP的使用
一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...
- Spring AOP: Spring之面向方面编程
Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...
- JAVA框架 Spring AOP--切入点表达式和通知类型
一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志
一.spring aop execution表达式说明 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义 ...
随机推荐
- xgboost:
https://www.zybuluo.com/Dounm/note/1031900 GBDT算法详解 http://mlnote.com/2016/10/05/a-guide-to-xgboost- ...
- 实现一个new操作符
new 操作符做了这些事: 1.它创建了一个全新的对象: 2.它会被执行[[Prototype]](也就是__proto__)链接: 3.它使this指向新创建的对象: 4.通过new创建的每个对象最 ...
- 学习-spring data jpa
spring data jpa对照表 Keyword Sample JPQL snippet And findByLastnameAndFirstname - where x.lastname = ? ...
- requests--会话对象,ssl验证
会话对象 前面我们使用了添加cookie的方式来进行接口的访问,如果有几十个接口都要依赖登录,难道我们都要加上吗? Request的会话对象让你能够跨请求保持某些参数,它也会在同一请求Session实 ...
- 教你查阅Java API 英文文档(JDK 11)
JAVA Document:https://docs.oracle.com/en/java/javase/11/ 然后找到“Specifications”并点击 API Documentation 比 ...
- C++中的双冒号作用
1. 作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分如:A,B表示两个类,在A,B中都有成员member.那么 ...
- c#ADO.NET 执行带参数及有返回数据
直接上代码,这个过程中有个数据SqlDataReader转为 DataTable的过程,当中为什么这样,是应为我直接绑定DataSource的时候没有数据,网人家说直接绑定但是没效果,我就转换了一下. ...
- C#集合中根据多个字段分组 group by linq表达式
void Main() { var empList =new List<Employee> { , FName = , Sex = 'M'}, , FName = , Sex = 'F'} ...
- 好用到哭!8个技巧让Vim菜鸟变专家
原文: https://juejin.im/post/5da68cb8f265da5b8c03c4a1 Vim只不过是一个文本编辑器,但如果你曾见过真正的高手是如何使用vim的,你就会知道,这个软件出 ...
- 2019 农信互联java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.农信互联等公司offer,岗位是Java后端开发,因为发展原因最终选择去了农信互联,入职一年时间了,也成为了面 ...