Spring学习笔记之AOP配置篇(一)
[TOC]
1. 创建并声明一个切面
- 首先,创建一个类,添加
@Component
注解使其添加到IoC容器 - 然后,添加
@Aspect
注解,使其成为一个切面 - 最后,在配置文件里面,使用
<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
注解来完成这个工作。
- 首先,明确我们的切面执行顺序
- 然后,在切面的类注解上添加
@Order
注解 - 最后,为
@Order
注解指明参数,比如@Order(1)
注意:参数越小,优先级越高
4. 使用切入点表达式
可能在某种需求下,我们需要为一个关注点织入多个切面、多种通知,那么此时按照上面的做法,为每一个通知函数指定execution
会显得很麻烦,这个时候我们就会用到切入点表达式了。切入点表达式看上去就是一个加了注解的方法,使用时调用该方法就是了。
使用切入点表达式需要按照以下步骤:
- 选择本类或者新建一个专门的切面配置类来容纳切入点表达式
- 声明一个方法比如为
public void cut(){}
,添加@Pointcut
注解 - 像普通的那样为其指明参数
@Pointcut(value = "execution(permission returnType packageName.className.methodName(parameters))")
- 在本类中使用,则在原来通知的value属性上指定该函数即可,比如
@Before(value = "cut()")
- 在其他类中使用,则需要在方法名前加上该方法的所属类名,比如
@Before(value = "className.cut()")
所以,推荐在切面所在包下创建一个切面配置类,而不是所有包共用一个配置类。
需要注意的是,@Pointcut
注解没有returning
参数,故不能带返回值
Spring学习笔记之AOP配置篇(一)的更多相关文章
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring学习笔记4——AOP
AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
- Spring学习笔记2—AOP
1.AOP概念 AOP(Aspect Oriented Programming):面向切面编程,AOP能够将那些与业务无关,却为业务模块所共同调用的应用(例如事务处理.日志管理.权限控制等)封装起来, ...
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
一.Spring IoC容器补充(1) Spring IoC容器,DI(依赖注入): 注入的方式:设值方法注入setter(属性注入)/构造子注入(构造函数传入依赖的对象)/字段注入Field(注解) ...
- Spring学习笔记之bean配置
1.命名bean 每个bean都有一个或者多个的的标识符.这些标识符必须在加载他们的容器里边唯一.一个bean经常有且只有一个标识符,但是如果需要超过一个的名字,可以考虑额外的别名. 基于xml的配置 ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...
- 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...
- 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...
随机推荐
- 解决Jenkins performance-plugin 解析jmeter jtl报告NumberFormatException "timeStamp"
报错日志: Performance: Failed to parse file '/var/lib/jenkins/jobs/Jmeter/jobs/jmeter-test/builds/14/per ...
- 使用c#解析json库
写了个c#版的json解析库,提供了json到hashtable以及hashtable到json字符串的转换 受惠于c#的语法特性,hashtable到json的解析变得非常简单 先判断传入的obje ...
- Reflect(反射)
反射.反射,程序员的快乐.反射是无处不在的. 那么什么是反射:通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指 ...
- 如何将txt的多行记录直接导入到mysql数据库
1.使用工具是navicat for mysql 2.要导入的txt格式要求,第一行为栏位,及个属性名 第二行开始为数据行 如下所示,例如要插入多行账号密码
- python迭代器生成器(一)
for循环可以用于python中任何序列类型,包括序列.元组以及字符串.例如: >>> for x in [1,2,3,4]: print(x * 2,end='')...2468 ...
- 记一次Nginx的配置
记第一次Nginx的配置 Nginx 首先了解到Nginx是干什么的?它有哪些作用?比较常用到的基础功能有反向代理.负载均衡.正向代理.http服务器.这次部署用到的就是反向代理. 反向代理就是指在目 ...
- seajs源码阅读
乘着周日有点时间,阅读一下玉伯大神的源码. seajs的源码写得真的很好,很是佩服,工整美观不愧是大神,造福百姓. 说起seajs不得不说,AMD和CMD的区别. CMD 推崇依赖就近,AMD 推崇 ...
- ASP.NET Core MVC 控制器创建与依赖注入
本文翻译自<Controller activation and dependency injection in ASP.NET Core MVC>,由于水平有限,故无法保证翻译完全准确,欢 ...
- Mac之OS系统下搭建JavaEE环境 <四> 之IntelliJ IDEA 的内存优化
1.代开IntelliJ IDEA 的显示内容 2. 打开idea.vmoptions文件 路径为Contens——bin——idea.vmoptions 修改之前会复制一份备份原配置 原配置 修改后 ...
- 软考 程序员 下午考题 c语言 笔记
1. 数组名 是表示数组空间首地址的指针常量,程序中不允许对常量赋值. 如 int a[]; a就是数组名,表示数组控件首地址的指针常量 a = 0;是错误的,不允许对指针常量赋值 &a ...