目录

  • 1. 创建并声明一个切面
  • 2. 使用切面的通知
  • 3. 定义切面的优先级
  • 4. 使用切入点表达式

1. 创建并声明一个切面

  1. 首先,创建一个类,添加@Component注解使其添加到IoC容器
  2. 然后,添加@Aspect注解,使其成为一个切面
  3. 最后,在配置文件里面,使用<aop:aspectj-autoproxy></aop:aspectj-autoproxy>来使其生效

2. 使用切面的通知

切面总共有6个通知类型,其中五个常用的为:前置通知、后置通知、返回通知、异常通知、环绕通知,一个不常用的为:引入通知。

而在五个常用的通知里,环绕通知功能最为强大,可以实现前四个的功能。

  • 前置通知

    • 添加@Before并指定注解参数:@Before(value = "execution(permission returnType packageName.className.methodName(parameters))")
    • 函数参数为: JoinPoint
  • 后置通知
    • 添加@After并指定注解参数:@After(value = "execution(permission returnType packageName.className.methodName(parameters))")
    • 函数参数为: JoinPoint
  • 返回通知
    • 添加@AfterReturning并指定注解参数:@AfterReturning(value = "execution(permission returnType packageName.className.methodName(parameters))",returning="result")
    • 函数参数为: JoinPoint, Object
  • 异常通知
    • 添加@AfterThrowing并指定注解参数:@AfterThrowing(value = "execution(permission returnType packageName.className.methodName(parameters))")
    • 函数参数为: JoinPoint
  • 环绕通知
    • 添加@Around并指定注解参数:@Around(value = "execution(permission returnType packageName.className.methodName(parameters))")
    • 函数参数为: ProceedingJoinPoint
    • 函数返回值为:Object

首先,上面代码中的名词为:

  • permission为访问权限
  • retrunType为返回值类型
  • packageName为目标(切入对象)的包限定名
  • className为目标的类名
  • methodName为横切关注点(关注函数)的名字
  • parameters为关注点传入的参数(只写类型即可)

其次,上面的注解都有一个隐藏的参数argNames,此参数可确定传入参数的顺序

3. 定义切面的优先级

当一个横切关注点有多个切面时,我们可能会需要明确切面的执行顺序,此时我们就需要@Order注解来完成这个工作。

  1. 首先,明确我们的切面执行顺序
  2. 然后,在切面的类注解上添加@Order注解
  3. 最后,为@Order注解指明参数,比如@Order(1)

注意:参数越小,优先级越高

4. 使用切入点表达式

可能在某种需求下,我们需要为一个关注点织入多个切面、多种通知,那么此时按照上面的做法,为每一个通知函数指定execution会显得很麻烦,这个时候我们就会用到切入点表达式了。切入点表达式看上去就是一个加了注解的方法,使用时调用该方法就是了。

使用切入点表达式需要按照以下步骤:

  1. 选择本类或者新建一个专门的切面配置类来容纳切入点表达式
  2. 声明一个方法比如为public void cut(){},添加@Pointcut注解
  3. 像普通的那样为其指明参数@Pointcut(value = "execution(permission returnType packageName.className.methodName(parameters))")
  4. 在本类中使用,则在原来通知的value属性上指定该函数即可,比如@Before(value = "cut()")
  5. 在其他类中使用,则需要在方法名前加上该方法的所属类名,比如@Before(value = "className.cut()")

所以,推荐在切面所在包下创建一个切面配置类,而不是所有包共用一个配置类。

需要注意的是,@Pointcut注解没有returning参数,故不能带返回值

转载于:https://www.cnblogs.com/yilixia/p/7340853.html

Spring学习笔记之AOP配置篇(一) 注解配置相关推荐

  1. Spring 学习笔记----->AOP

    Spring 学习笔记----->AOP 代理模式 为什么学代理模式? 因为这就是Spring Aop的底层 代理模式的分类: 静态代理 动态代理 静态代理 生活用的例子: 房东 public ...

  2. Spring学习笔记002 - AOP

    2019独角兽企业重金招聘Python工程师标准>>> 一.AOP的几个概念 1.Aspect,表示切面功能 配置如下: <?xml version="1.0&quo ...

  3. 【Spring学习笔记】AOP

    文章目录 一.何为AOP? 二.AOP相关术语 三.AOP流行框架比较 四.动态代理 1.创建接口UserDao 2.创建实现类 UserDaoImpl 3.创建切面类MyAspect 4.创建代理类 ...

  4. Spring学习笔记7_使用JSR 330标准注解(Using JSR 330 Standard Annotations)

    文章参考来源:Spring Framework官方文档 从Spring 3.0开始,Spring提供了对JSR-330标准注解(依赖注入)的支持.这些注释的扫描方式与Spring注解扫描方式相同. @ ...

  5. 20.Spring学习笔记_基于配置文件的方式来配置 AOP(by尚硅谷_佟刚)

    基于 XML 的配置声明切面 除了使用 AspectJ 注解声明切面, Spring 也支持在 Bean 配置文件中声明切面. 这种声明是通过 aop schema 中的 XML 元素完成的. 正常情 ...

  6. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  7. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  8. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  9. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

最新文章

  1. SCI论文写作训练营笔记汇总03_科技论文写作(方法篇)
  2. 解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接)
  3. Java进制间的转换
  4. Redis 那么快之底层 ziplist 的奥秘!
  5. IDEA快速升级模块版本号
  6. 电商后台之【商品管理系统】
  7. 计算机病毒note01
  8. js 获取字符长度(英文1,中文2)
  9. 甲骨文裁员,华大人员瘦身优化,亚马逊鼓励离职?
  10. w10恢复出厂设置_w10电脑恢复出厂设置 w10电脑恢复出厂设置的方法
  11. 饺子播放器使用IJKPlayer播放MP4文件
  12. 小设备 大智慧——天霆交互技术让终端变得更智能
  13. 记录安装python+appium+模拟器的自动化
  14. Spyder 运行时kernels启动报错
  15. java常见正则表达式用法
  16. 仇人与恩人- 挺有意义的
  17. android 联系人导入iphone,4种快速将联系人导入iPhone的方法
  18. 关于实名认证上线时无法立即返回实名认证结果的问题
  19. mmsegmentation自定义新数据集
  20. JMockit 如何 mock 异常

热门文章

  1. Fastformer:史上最强最快Transformer!清华、MSRA出品!
  2. 收藏 | 目标检测的模型集成与实验
  3. RuntimeError: Found 0 files in subfolders of: ./data/image Supported extensions are: .jpg,.jpeg,.png
  4. 神器:多卡同步的Batch Normalization
  5. 呕心沥血干完K-Means聚类——深度AI科普团队
  6. 在NVIDIA Jetson TX2上安装TensorFlow
  7. PID参数整定法(1)
  8. 复练-关于面试的科技树-V1004-求职面试的阶段和策略
  9. 软考,个人快速成长最好的投资
  10. php study 直接显示代码_《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12