[TOC]

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参数,故不能带返回值

Spring学习笔记之AOP配置篇(一)的更多相关文章

  1. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  2. Spring学习笔记4——AOP

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  3. Spring学习笔记2—AOP

    1.AOP概念 AOP(Aspect Oriented Programming):面向切面编程,AOP能够将那些与业务无关,却为业务模块所共同调用的应用(例如事务处理.日志管理.权限控制等)封装起来, ...

  4. [Spring学习笔记 4 ] AOP 概念原理以及java动态代理

    一.Spring IoC容器补充(1) Spring IoC容器,DI(依赖注入): 注入的方式:设值方法注入setter(属性注入)/构造子注入(构造函数传入依赖的对象)/字段注入Field(注解) ...

  5. Spring学习笔记之bean配置

    1.命名bean 每个bean都有一个或者多个的的标识符.这些标识符必须在加载他们的容器里边唯一.一个bean经常有且只有一个标识符,但是如果需要超过一个的名字,可以考虑额外的别名. 基于xml的配置 ...

  6. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  7. 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...

  8. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...

  9. 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...

随机推荐

  1. qmake 提示 Failure to open file:****

    执行qmake时报错,如下图所示: 解决方法: 将***.pro文件夹的属主改为当前用户,具体操作为: 1.切换登录用户为:root 2.#chown -R ies:ies /usr/appsoft ...

  2. html之改变图片透明度而不改变文字的透明度--两种方法实现

    图片与图片上的文字设置不同的透明度的两种方法: 第一种方法:背景图+定位+background: url(timg.jpg)no-repeat; <!DOCTYPE html> <h ...

  3. php下拉菜单选中值在选择之后保留并且显示

    <select id="select_platform" name="source" style="height:35px;"> ...

  4. 容器如何访问外部世界?- 每天5分钟玩转 Docker 容器技术(36)

    前面我们已经解决了容器间通信的问题,接下来讨论容器如何与外部世界通信.这里涉及两个方向: 容器访问外部世界 外部世界访问容器 容器访问外部世界 在我们当前的实验环境下,docker host 是可以访 ...

  5. Linux实战教学笔记13:定时任务补充

    第十三节 定时任务补充 标签(空格分隔): Linux实战教学笔记 ---[更多资料点我查看][1] 1,生产环境常用Crontab专业实例 1.1书写crontab定时任务多个基本要领 1.1.1 ...

  6. Android高仿qq及微信底部菜单的几种实现方式

    最近项目没那么忙,想着开发app的话,有很多都是重复,既然是重复的,那就没有必要每次都去写,所以就想着写一个app通用的基本框架,这里说的框架不是什么MVC,MVP,MVVM这种,而是app开发的通用 ...

  7. c# 上传附件大小限制的问题

    在c# 相关的asp.net  中.需要设置附件的大小.需要修改2部分. 1.修改metabase.XML 以Windows2003 为例子. 打开 C:\Windows\System32\Inets ...

  8. Java开发从初级到中级

    本人正统软件工程专业毕业,虽然实力垫底,但是大学的时候,整个学校非常热衷于OJ,ACM之类,耳濡目染,自以为基础的知识是有的.但是 一直觉得学的东西都是一团浆糊,按照老师的话说,我是那种看书只看目录, ...

  9. Linux - 请允许我静静地后台运行

    h1,h2,h3,h4,h5,h6,p,blockquote { margin: 0; padding: 0 } body { font-family: "Helvetica Neue&qu ...

  10. CSS 样式书写规范

    可能不同团队都有各自的规范,又或者很多人在写 CSS 的时候还是想到什么就写什么,不存在太多的约束. 我觉得 CSS 代码规范还是有存在的必要的,尤其是在团队配合,多人协作下,规范就显得尤为重要. 本 ...