切入点和切入点表达式(AOP面向切面编程)
https://blog.csdn.net/keda8997110/article/details/50747923/
AOP面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
简单来说, 就是在程序运行期间, 在不修改源码的情况下, 对正在运行的方法进行功能增强,添加或删除某些功能。
在使用AOP进行切面开发的过程中,需要配置一下我们的切入点,也就是配置一下我们要增强哪些方法。配置切入点,就需要编写切入点表达式,通过切入点表达式去找到我们的切入点(被增强方法)。
配置切入点
@Pointcut注解:
通过@Pointcut注解配置切入点。该注解作用在方法上。我们在编写增强方法的时候,切入点的名字就是该方法的方法名。
@Pointcut注解中的切入点表达式,就是我们要对哪些方法进行增强。
/*** 配置切入点,编写切入点表达式. 我们要增强什么*/
@Pointcut("execution(* com.xue.demo.service.impl.*.*(..))")
public void pointCut() {}/*** 前置通知*/
@Before(value = "pointCut()")
public void beforeRun() {System.out.println("执行之前执行,前置通知");
}
这里我们对com.xue.demo.service.impl包下的所有类的所有的方法进行了增强。我们在调用com.xue.demo.service.impl包下的所有类的所有的方法前,会先执行我们的前置通知方法。
对切入点的配置,还有其他的方式。
如果我们要配置两个切入点,比如需要对两个包下的方法进行增强,我们就需要编写两个切入点表达式。因此,我们的切入点表达式支持使用&&、|| 和 !。
我们可以配置两个切入点,用两个不同的方法名。然后我们再配置一个切入点,该切入点的切入点表达式就是那两个切入点的方法名组合而成的。
@Pointcut("execution(* com.xue.demo.service.impl.*.ru*(..))")
public void pointCutR() {}
@Pointcut("execution(* com.xue.demo.service.impl.*.ju*(..))")
public void pointCutJ() {}
@Pointcut("pointCutJ() || pointCutR()")
public void pointCut() {}
这里配置了两个切入点,方法分别是pointCutR()和pointCutJ()。这两个方法分别对com.xue.demo.service.impl包下的所有类的ru开头的方法和com.xue.demo.service.impl包下的ju开头的方法进行了增强。我们可以再配置一个切入点,该切入点的表达式就是pointCutR()和pointCutJ()两个方法的方法名。使用 || 连接。表示 com.xue.demo.service.impl包下的所有类的ru开头的方法和ju开头的方法都会被增强。
切入点表达式:
切入点表达式主要为了帮助我们增强我们要增强的方法。根据切入点表达式,可以找到我们要增强的方法。个人理解,感觉就像是一个导航,通过切入点表达式,就可以知道哪些方法需要被增强。
切入点表达式由 访问修饰符 返回值 报名 类名 方法名 以及我们的方法的参数组成。其中访问修饰符是可以省略不写的。返回值我们可以根据我们要增强的方法进行选择。也可以使用通配符 * ,表示所有返回类型的方法全部都被增强。
切入点表达式中的包名,表示了指定包下的类需要被增强。包名也可以使用通配符 * 表示。
类名和方法名也都可以使用我们的通配符 * 表示。但是方法中的参数,我们使用的是(…)表示多个参数。还可以指定增强方法的参数类型。
在进行切入点配置的时候,支持多种配置方式。可以根据我们的需求,对指定的方法进行增强。
execution:用于匹配方法执行的连接点。
within:用于匹配指定类型内的方法执行。
this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配。
target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配。
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法。
@within:用于匹配所以持有指定注解类型内的方法。
@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解。
@args:用于匹配当前执行的方法传入的参数持有指定注解的执行。
@annotation:用于匹配当前执行方法持有指定注解的方法。
举例:
@Pointcut("execution(* com.xue.demo.service.impl.*.*(..))")
public void point() {}
该切入点表达式可以对对指定的方法进行增强的切入点方法
@Pointcut("within(com.xue.demo.service.impl.*)")
public void point() {}
该切入点表达式可以对指定的类的中的所有的方法进行增强
@Pointcut("this(com.xue.demo.service.EmployeeService)")
public void point() {}
用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
@Pointcut("target(com.xue.demo.service.EmployeeService)")
public void point() {}
用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配
@Pointcut("args(String)")
public void point() {}
用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@Pointcut("@within(com.xue.demo.annotation.Custom)")
public void point1() {}
任何目标对象对应的类型持有Custom注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用。
@Pointcut("@target(com.xue.demo.annotation.Custom)")
public void point2() {}
任何目标对象持有Custom注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
@Pointcut("@args(com.xue.demo.annotation.Custom)")
public void point3() {}
任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解 com.xue.demo.annotation.Custom;动态切入点,类似于arg指示符;
@Pointcut("@annotation(com.xue.demo.annotation.Custom)")
public void point4() {}
使用“@annotation(注解类型)”匹配当前执行方法持有指定注解的方法;注解类型也必须是全限定类型名;
文章中有不对的地方,务必指正,互相学习,共同进步。
切入点和切入点表达式(AOP面向切面编程)相关推荐
- 大数据WEB阶段Spring框架 AOP面向切面编程(一)
Spring - AOP面向切面编程(一) 一.代理模式概述 代理的特点:(目标对象即被代理者) 实现和目标对象相同的接口 具备和目标对象的方法 代理者不仅要做目标对象的方法 , 还要做一些额外的操作 ...
- 大数据WEB阶段Spring框架 AOP面向切面编程(二)
Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...
- spring中AOP(面向切面编程)
spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...
- Springboot 一文搞懂AOP面向切面编程
Springboot AOP面向切面编程 AOP简介 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. 作用:在不惊动原始设计的 ...
- 【SSM】Spring系列——AOP面向切面编程
文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...
- AOP面向切面编程之全局日志打印/统计接口耗时
目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...
- SpringBoot之AOP面向切面编程实例
目录 1.引入pom依赖 2.切入点表达式 --组成 --逻辑运算符 --通配符 --范例 3. 启动类配置 4.通知类型 4.1 @Before : 标注当前方法作为前置通知 4.1.1 创建自定义 ...
- 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )
文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...
- Spring AOP面向切面编程
AOP面向切面编程: AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公 ...
最新文章
- 实战 | 哪个瞬间让你突然觉得CV技术真有用?
- 【linux】tc命令使用总结
- asp.net 学习的一些地址
- 生成学习算法Generative Learning algorithms
- 【Python】创建长度为n的全0列表和全1列表
- 使用nginx动静分离后,druid被拦截的解决方法
- python模拟浏览器请求的库_基于Python模拟浏览器发送http请求
- LTE学习:同步信号
- 文本属性之装饰文本(CSS、HTML)
- Linux 卸载JDK以及安装步骤
- matlab单项pwm整流电流内环pr控制仿真,基于PR的单相PWM整流器电流控制研究
- Cadence Allegro PCB 17.4的叠层、正片和负片的设计
- 用qq账号和密码实现登录网易云音乐
- java 如何清除临时文件_如何删除Java中的临时文件?
- 医院管理系统(Java+SSM+MySQL开发的医院科室管理系统)
- 记录阿里云虚拟主机FTP连接不上的解决办法
- 计算机进入启动死循环,win7系统重装死循环一直反复关机重启的解决方法
- 浅谈北京市IT行业现状及就业前景——暑期实践调研
- 布局 flex让元素一个靠左一个靠右
- facebook头像和昵称_如何将昵称添加到您的Facebook个人资料
热门文章
- 扫描识别工具Dynamic Web TWAIN使用教程:移动浏览器捕获(上)
- AndroBench手机性能测试【转】
- Newton牛顿法(一)| 基本思想+迭代公式
- (2)二叉树由后序(LRD)和中序(LDR)得到前序(DLR)
- 摄像头poe供电原理_无线监控中poe供电原理图解
- 电子设计硬件可靠性设计----总结2
- 【初识数据结构】c语言实现动态顺序表(已配图)
- 新唐 Nuvoton NUC029 入门 点亮板载LED
- “找不到存储过程’’ … 错误:2812”的解决方法
- 自动化办公神器!用Python批量识别发票并录入到Excel表格!可以讨财务女神开心了!