【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"切入点" 例如定义 ...
随机推荐
- LeetCode 204. Count Primes计数质数 (C++)
题目: Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: ...
- 读架构漫谈&我眼中的架构师
本周是开学的第二周,读了由资深架构师王概凯 Kevin 执笔的系列专栏架构漫谈.初识这门课,懂得也不是很多,读了架构漫谈,有了一些理解. 首先作者讲述了缘起,由早期人独立自主生活到后来的集群,作者由这 ...
- Tcp与Http
TCP协议对应传输层,而HTTP协议对应应用层.Http协议是建立在TCP协议基础之上的.当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通 ...
- 你真的了解FastClick吗?
你真的了解FastClick吗? 前段时间在做公司官网手机端菜单部分的时候,遇到一些很诡异的点击问题.比如菜单点击无效/双击才有效.在手指滑动的时候会触发点击事件.以及同样的事件处理在微信跟浏览器会有 ...
- 【未完成】【Mybatis】字段由字符+数字变量组成,但要对变量进行计算
??????????????????????
- 【oracle】ORA-12638 : 身份证明检索失败
sqlnet.ora 1.删了 2.#注释了 背后缘由:待写
- 【oracle】存储过程:将select查询的结果存到变量中
- 从网络服务生成Apex类
使用WSDL2Apex从网络服务生成Apex类 如果某个网络服务被定义在WSDL文件中,而Salesforce必须使用SOAP和网络服务进行通信,则这种情况在某些时候会为开发者带来很多麻烦.为了简化S ...
- DIV+CSS+JS实现色彩渐变字体
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- [LeetCode] 464. Can I Win 我能赢吗
In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...