1.背景知识

在Sping中使用AOP的主要工作是配置织入关系,使用<aop:config>标签代表这一段是织入关系的配置
首先,用<aop:aspect>标签声明一个切面,这里要引用我们之前编写好的切面类极其在配置文件中注册的id(myAspect)
然后,通过<aop:[aopMethod]>标签对各种类型的增强进行配置,前置增强用before,后置增强用after
切面=增强+切点,所以在对应的增强类型中我们还要指定具体的增强方法和切点,配置切点就需要切点表达式

<!--配置织入关系:告诉Spring,哪些切点(目标方法)需要进行哪些增强(前置、后置等等...)--><aop:config><!--声明切面--><aop:aspect ref="myAspect"><!--切面=增强+切点--><aop:before method="beforeEnhance" pointcut="execution(public void com.lxl.aop.Target.service())"/><aop:after method="afterEnhance" pointcut="execution(public void com.lxl.aop.Target.service())"/></aop:aspect></aop:config>

2.切点表达式的写法

切点表达式的语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数)),其中

  • 修饰符可以省略
  • 返回值类型、包名、类名、方法名可以用*代替
  • 包名与类名之前一个点.代表当前包写的类,两个点…代表当前包极其子包下的所有类
  • 参数列表可以用两个点…代表任意类型、任意个数的参数

1.最明确也是范围最小的一种声明:所有的地方都不省略,但是这样只能声明一个方法,不方便
excecution(public void com.lxl.aop.Target.service())

2.代表Target类下的所有方法都要声明成切点,不过返回值必须都是void
excecution( void com.lxl.aop.Target.*(..))

3.这种声明方法最常用,代表aop当前包下的所有类的任何方法都声明成切点,需要被增强
excecution( * com.lxl.aop.*.*(..))

4.拓展了上面的方法,把aop包极其子包下的所有类也声明成了切点
excecution( * com.lxl.aop..*.*(..))

3.切点表达式的抽取

首先,我们在applicationContext.xml中有一个织入的配置,但是发现所有的增强都是用的同一个切点表达式:

<!--配置织入关系:告诉Spring,哪些切点(目标方法)需要进行哪些增强(前置、后置等等...)--><aop:config><!--声明切面--><aop:aspect ref="myAspect"><!--切面=增强+切点--><aop:before method="beforeEnhance" pointcut="execution( * com.lxl.aop.Target.*(..))"/><aop:after-returning method="afterReturningEnhance" pointcut="execution( * com.lxl.aop.Target.*(..))"/><aop:after method="afterEnhance" pointcut="execution( * com.lxl.aop.Target.*(..))"/><aop:around method="aroundEnhance" pointcut="execution( * com.lxl.aop.Target.*(..))"/><aop:after-throwing method="throwingEnhance" pointcut="execution( * com.lxl.aop.Target.*(..))"/></aop:aspect></aop:config>

抽点表达式都是相同的,但是重复去写很麻烦,而且也不利于后期的维护,所有可以把他们抽取出来:
<aop:pointcut id="myPointcut" expression="execution( * com.lxl.aop.Target.*(..))"/>

所以原先的织入配置就可以改为:

  <!--配置织入关系:告诉Spring,哪些切点(目标方法)需要进行哪些增强(前置、后置等等...)--><aop:config><!--声明切面--><aop:aspect ref="myAspect"><!--切面=增强+切点--><!--抽取切点表达式--><aop:pointcut id="myPointcut" expression="execution( * com.lxl.aop.Target.*(..))"/><aop:before method="beforeEnhance" pointcut-ref="myPointcut"/><aop:after-returning method="afterReturningEnhance" pointcut-ref="myPointcut"/><aop:after method="afterEnhance" pointcut-ref="myPointcut"/><aop:around method="aroundEnhance" pointcut-ref="myPointcut"/><aop:after-throwing method="throwingEnhance" pointcut-ref="myPointcut"/></aop:aspect></aop:config>

补充:注解配置中切点表达式的抽取方法
在切面类中自定义一个方法,然后在方法上加上 @Pointcut(“excecution(…)”)注解,在增强方法中使用时直接进行引用即可:

@Component("myAspect")
@Aspect // 告知Spring容器当前MyAspect类是一个切面类
public class MyAspect {@Pointcut("execution(* com.lxl.aopAnnotation.Target.*(..))")public void myPoint(){}@Before("MyAspect.myPoint()")public void beforeEnhance(){System.out.println("前置增强,在切点的前面执行.......");}
}

Spring学习之AOP的切点表达式详解相关推荐

  1. SpringBoot使用AOP,PointCut表达式详解以及使用

    SpringBoot使用AOP,PointCut表达式详解以及使用 1.相关注解 2.PointCut 表达式详解 2.1 execution: 2.1 within: 2.3. this: 2.4. ...

  2. SpringBoot的AOP中PointCut表达式详解以及使用

    首先,在pom.xml中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifa ...

  3. Spring AOP切点表达式详解

    1. 简介 面向对象编程,也称为OOP(即Object Oriented Programming)最大的优点在于能够将业务模块进行封装,从而达到功能复用的目的.通过面向对象编程,不同的模板可以相互组装 ...

  4. springboot aop的execution 表达式详解

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

  5. Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...

    本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...

  6. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...

  7. Spring学习(五)bean装配详解之 【XML方式配置】

    本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...

  8. @AspectJ中的切点表达式详解

    本文来说下@AspectJ中的切点表达式 文章目录 概述 概述

  9. Spring boot 之 aop pointcut execution规则详解

    文章目录 规则表达式含义 规则表达式 组合使用 或 与 非 示例 规则表达式含义 任意公共方法的执行: execution(public * *(..)) ##public可以省略, 第一个* 代表方 ...

最新文章

  1. 你知道实习对你有多重要吗?
  2. Spring Cloud Alibaba 一致性挑战:微服务架构下的数据一致性解决方案
  3. TFS修改工作区映射区
  4. GCD HDU - 1695
  5. Delphi7函数大全
  6. 挣值管理:PV,AC和EV
  7. java中常见数据库字段类型与java.sql.Types的对应
  8. 将 Java 作为入门编程语言有错吗?
  9. ICPC2020小米网络选拔赛第一场复盘
  10. go 执行shell 命令
  11. VOS防止盗打及后门的安全策略
  12. Python实现SM4算法
  13. 什么是PLC?可编程控制器的结构和工作原理介绍
  14. C语言基础知识梳理总结
  15. android 日历翻页动画,Android开源库合集:轻松实现Android动态,炫目:日历效果...
  16. 如何看待何恺明最新一作论文Masked Autoencoders?
  17. 日语语法笔记【翻译】
  18. Bonferroni校正
  19. Java中,amp;amp;amp;amp;与amp;amp;,||与|的区别
  20. 如何设计出完美的动画技术架构

热门文章

  1. 手机误删图片怎么恢复方法大全
  2. 什么是常量?什么是变量?
  3. Odoo产品分析 (二) -- 商业板块(1) -- 销售(3)
  4. 《牛津字典精华总结》- 初阶系列 - 字母 - O
  5. 未来电视张建华:微信为内容提供商提供发展空间(转)
  6. 使用jquery移除元素事件
  7. 计算机等级对高考加分,什么是“等级赋分制”?不懂它高考要吃大亏!
  8. 百度网盘不是会员如何提速
  9. 超简单但又超有效的基于CNN的暗光成像模型
  10. 图灵程序设计丛书•鲜活的数据:数据可视化指南 - 电子书下载(高清版PDF格式+EPUB格式)...