Spring 笔记三 AOP
1、AOP 概述
AOP (Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP (Object-Oriented Programming,面向对象编程)的补充。
AOP 就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
作用:在程序运行期间,不修改源码对已有方法进行增强。
优势:减少重复代码、提高开发效率、维护方便。
实现方式:使用动态代理技术。
涉及 AOP 的专业术语:

2、AOP 的使用步骤
【1】导包:6基础包+1切面基础包+3切面加强包
spring-beans-4.0.0.RELEASE
spring-context-4.0.0.RELEASE
spring-core-4.0.0.RELEASE com.springsource.net.sf.cglib-2.2.0
spring-expression-4.0.0.RELEASE + spring-aspects-4.0.0.RELEASE + com.springsource.org.aopalliance-1.0.0
spring-aop-4.0.0.RELEASE com.springsource.org.aspectj.weaver-1.6.8.RELEASE
commons-logging-1.1.3
【2】写配置
1. 将目标类和切面类(封装了通知方法(在目标方法执行前后执行的方法))加入到ioc容器中。
目标类:

切面类

2. 告诉Spring到底哪个是切面类 @Aspect
切面类

3. 告诉 Spring,切面类里面的每一个方法,都是何时何地运行;

4. 开启基于注解的 AOP 模式

3、细节
【1】IOC 容器中保存的是组件的代理对象
从 IOC 容器中拿到目标对象;注意:如果想要用类型,一定用他的接口类型,不要用它本类。
AOP的底层就是动态代理,容器中保存的组件是他的代理对象;$Proxy12。当然不是本类的类型

如果目标类没有接口怎么办?
没有接口就是本类类型,可以通过本类类型拿,也可以通过本类 id 拿,id 值为类名首字母小写。

【2】切入点表达式的写法
固定格式:execution(访问权限符 返回值类型 方法全类名(参数表))
通配符:两种
* :
1. 匹配一个或者多个字符
2. 匹配任意一个参数
3. 只能匹配一层路径
4. 权限位置 * 不能;权限位置不写就行;public【可选的】
.. :
1. 匹配任意多个参数,任意类型参数
2. 匹配任意多层路径
通配符总结:
1. 最精确的:execution(public int com.atguigu.impl.CalculatorImpl.add(int,int))
2. 最模糊的:execution(* *.*(..)),千万别这样写(见方法就切);
3. 通用写法:execution(* com.atguigu.impl.*.*(..))
【3】通知方法的执行顺序:两种

正常情况:@Before(前置通知)===== @After(后置通知)==== @AfterReturning(正常返回);
异常情况:@Before(前置通知)===== @After(后置通知)==== @AfterThrowing(方法异常);
【4】JoinPoint 获取目标方法的信息
1、只需要为通知方法的参数列表上写一个参数 JointPoint jointPoint,这个参数封装了当前目标方法的详细信息。
2、方法正常执行完成,如何获取返回值。returning="result";告诉 Spring 这个 result 用来接收返回值。

3、方法执行处问题了,如何接异常信息?throwing="exception":告诉 Spring 哪个参数是用来接收异常。

【5】Spring 对通知方法的约束
1. Spring对通知方法的要求不严格,有无返回值,返回值类型不限制。
2. 唯一要求的就是方法的参数列表一定不能乱写?因为通知方法是 Spring 利用反射调用的,每次方法调用得确定这个方法的参数表的值。
【6】切入点表达式的重用
1. 先声明一个没有实现的返回void的空方法。
2. 给方法上标注 @Pintcut 注解。

【7】环绕通知
环绕通知是 Spring 最强大的通知,四合一通知。

【8】环绕通知执行顺序
环绕通知优先于普通通知执行
环绕前置===普通前置===目标方法执行===环绕返回/环绕异常===环绕后置===普通后置===普通返回/普通异常。
细节:有异常环绕一定要把异常抛出去,这样才能被普通异常捕获,否则环绕有异常,环绕吃掉异常,普通正常返回,但没有返回值。
【9】多切面运行顺序
1. 不加环绕通知:
1. 先进后出,谁里谁外看字幕顺序。
2. 使用 @Order 注解,值小的先执行。

2. 加环绕
看环绕在那个切面类。环绕只是影响当前切面。
4、AOP 使用场景
【1】AOP 加日志保存到数据库
【2】AOP 做权限验证
【3】AOP 做安全检查
【4】AOP 做事务控制
5、基于 xml 配置的 AOP 写法
【1】回顾基于注解的AOP
1. 将目标类和切面类交给 Spring 管理,@Component、@Service
2. 告诉 Spring 哪个是切面类,@Aspect
3. 告诉 Spring 通知方法何时何地运行
4. 开启注解
【2】xml 写法
1. 将目标类和切面类交给 Spring 管理

2、3. 告诉 Spring 哪个是切面类,通知方法何时何地运行。

细节:
1. 切入点表达式可以写在通知方法内、切面类内方法外、切面类外。

【注解和 xml 配置写法比较】
1. 注解:快速方便
2. xml 配置:功能完善,重要的用配置。
Spring 笔记三 AOP的更多相关文章
- Spring笔记(三)AOP前篇之动态代理
AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态 ...
- Spring笔记:AOP基础
Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...
- Spring in Action 学习笔记三-AOP
面向切面的Spring 2015年10月9日 11:30 屏幕剪辑的捕获时间: 2015-10-9 14:30 屏幕剪辑的捕获时间: 2015-10-9 ...
- Spring笔记三
Spring-03 1. AOP 1.1 概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...
- spring笔记(三)
Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的“事务控制”, 可以用aop实现! 即只需要写一次,运行时候动 ...
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- Spring学习笔记(四)—— Spring中的AOP
一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- Spring(三)面向切面编程(AOP)
在直系学长曾经的指导下,参考了直系学长的博客(https://www.cnblogs.com/WellHold/p/6655769.html)学习Spring的另一个核心概念--面向切片编程,即AOP ...
- Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式
1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动 ...
随机推荐
- OpenCv:边缘处理&Canny边缘检测
卷积边缘: 一.在进行卷积的时候,对于原图像(1,1)的位置,左.上方没有足够的像素做卷积. 二.通常,在卷积之前,在原图增加边缘像素,比如(3*3的,增加一个像素) 三.增加像素值得处理方法,通常有 ...
- dynamics 365 复制(克隆)现有组织
很多时候需要复制现有的开发环境作为新的开发环境,以保留原有测试数据,旧的开发环境作为问题修复环境,以下是复制步骤: 1. 登录数据库服务器,备份现有数据库 2. 还原数据库为新的数据库名称 3. 在前 ...
- 实战记录在 Linux Ubuntu 20.04 安装VNC 远程桌面
Virtual Network Computing (VNC),是一个图形桌面共享系统,允许我们像使用Windows桌面系统一样可视化的使用键盘和鼠标远程控制服务器,当做一台远程的电脑一样. 主要用在 ...
- 学术主页——朱青橙(Qingcheng Zhu)
个人简介 来自北京邮电大学 教育经历 毕业于苏州大学 奖励荣誉 学术论文 发明专利 国际标准 科研项目
- Cloud9 3.0 SDK安装
Cloud9 IDE是一个基于Node.JS构建的JavaScript程序开发Web IDE.它拥有一个非常快的文本编辑器支持为JS, HTML, CSS和这几种的混合代码进行着色显示.Cloud9 ...
- 像MIUI一样做Zabbix二次开发(1)——MIUI之于Android,乐维监控之于Zabbix
摘要 文章主要介绍:7年做Zabbix二次开发,讲述那些从技术方向的选择,到开发.架构设计.深度定制,到我们的更多前瞻性想法. 关于MIUI "专注.极致.口碑.快"成了雷布斯的口 ...
- 命令行编译、运行带包(package)的java源码
首先安装好JDK,过程略. 准备一个源码Main.java,如下 1 package com.compiltetest; 2 3 public class Main { 4 5 public stat ...
- 【SQL Server】获取表格插入的id(二)——newID()
现在有一个需求,插入api调用日志表.然后,发起HTTP请求()请求时,需要带入日志表的id). 简化无关的添加,SQL Server表格设计如下: CREATE TABLE mylog ( id I ...
- (jmeter笔记)添加正则提取器和JSON提取器
添加正则提取器和JSON提取器 1.正则提取器: 返回的Token如下: 引用名称:可以理解为变量名 //调用表示${变量名} 正则表达式:"Token":"(.+?)& ...
- 【2020NOI.AC省选模拟#6】A. zyb的监控计划
题目链接 原题解: 考虑我们需要的信息:子树里最浅的一个能向上的点是谁?子树里最深的一个没被覆盖的深度是多少? 我们记录一下$f_{i,a,b}$表示上面两个信息为$a$和$b$的时候,最少要花费的代 ...