10、Spring之AOP概述
10.1、概念
AOP(Aspect Oriented Programming)是一种设计思想,是软件设计领域中的面向切面编程
AOP是面向对象编程(OOP)的一种补充和完善,OOP是纵向继承机制,AOP是横向抽取机制
AOP能通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下动态地为程序添加统一的附加功能
10.2、术语
10.2.1、横切关注点
横切关注点是从目标方法中抽取出来的非核心业务代码,一个目标方法中可以有多个横切关注点
public int add(int i, int j) {
//输出日志属于非核心业务,这是该目标方法的第1个横切关注点
System.out.println("[日志] add 方法开始了,参数是:" + i + "," + j);
int result = i + j;
System.out.println("方法内部 result = " + result);
//输出日志属于非核心业务,这是该目标方法的第2个横切关注点
System.out.println("[日志] add 方法结束了,结果是:" + result);
return result;
}
10.2.2、通知
非核心业务代码在目标方法中叫横切关注点,其被抽取封装到一个类(切面类)的方法中,这样的方法就是通知方法
通知方法一共有五种类型:
前置通知:在被代理的目标方法前执行
返回通知:在被代理的目标方法成功结束后执行(寿终正寝)
异常通知:在被代理的目标方法异常结束后执行(死于非命)
后置通知:在被代理的目标方法最终结束后执行(盖棺定论)
环绕通知:包括上面四种通知对应的所有位置
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
//前置通知增强位置:在调用目标对象执行功能之前,加入额外的操作
System.out.println("[日志] "+method.getName()+" 方法开始了,参数是:" + Arrays.toString(args));
//调用目标对象实现的核心逻辑
result = method.invoke(target, args);
//返回通知增强位置:在调用目标对象执行功能之后,加入额外的操作)
System.out.println("[日志] "+method.getName()+" 方法结束了,结果是:" + result);
} catch (Exception e) {
//异常通知增强位置:在调用目标对象执行功能发生异常时,加入额外的操作
System.out.println("[日志] "+method.getName()+",异常:"+e.getMessage());
} finally {
//后置通知增强位置:在调用目标对象执行功能完毕时,加入额外的操作
System.out.println("[日志] "+method.getName()+",方法执行完毕");
}
//保证代理对象和目标对象的返回值一致
return result;
}
10.2.3、切面
切面是封装通知方法(横切关注点)的类,也叫切面类
10.2.4、目标
目标是被代理的(目标)对象,也就是要进行功能增强的对象,也可以说是要被抽取非核心业务代码的对象
10.2.5、代理
代理是对目标对象进行功能增强的(代理)对象,这个(代理)对象会由AOP通过代理模式自动创建
10.2.6、连接点
连接点是抽取横切关注点的位置
10.2.7、切入点
切入点是一个表达式,可以定位出连接点,从而实现把切面类中的通知方法安插到该位置
10.3、作用
简化代码:把方法中固定位置的重复代码抽取出来,让被抽取非核心业务代码的方法更专注于自己的核心功能,从而提高内聚性
代码增强:把特定的功能封装到切面类中,哪里有需要就往哪里安插,被安插了切面类特定功能的方法就被切面给增强了
10、Spring之AOP概述的更多相关文章
- Spring 的 AOP 概述和底层实现
Spring 的 AOP 概述和底层实现 1. 什么是 AOP AOP (Aspect Oriented Programing),即面向切面编程 AOP 采取横向抽取机制,取代了传统纵向继承体系重复性 ...
- 10 Spring框架 AOP (三) Spring对AspectJ的整合
上两节我们讲了Spring对AOP的实现,但是在我们的开发中我们不太使用Spring自身的对AOP的实现,而是使用AspectJ,AspectJ是一个面向切面的框架,它扩展了Java语言.Aspect ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring AOP学习笔记01:AOP概述
1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- Spring技术内幕总结 - AOP概述
AOP是Aspect-Oriented Programming(面向方面/切面编程)的简称.Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.分离关注点使解决特定领域问题的 ...
- Spring框架的核心功能之AOP概述
1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 ...
- Spring之二:Spring AOP概述
一.AOP概念回顾 AOP是Aspect-Oriented Programming(面向方面编程)的简称, 虽然可以利用面向对象的方法可以很好地组织代码,也可以通过继承关系实现代码重用,但是程序中总是 ...
- Spring源码剖析6:Spring AOP概述
原文出处: 五月的仓颉 我们为什么要使用 AOP 前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring AOP的时候写的,比较基础.这篇文章最后的推荐以及回复认为我写的对大 ...
随机推荐
- 2021-10-30:有效的字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位
2021-10-30:有效的字母异位词.给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位 ...
- 软硬件--智能穿戴常见BUG及原因分析
软硬件--智能穿戴常见BUG及原因分析 1.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 按侧键,设备时间出现倒退现象:频率切换相关问题: 2.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 ...
- 【工作随手记】并发之synchronized
synchronized对于java同学肯定都是耳熟能详的必修课了.但是不管对于新手还是老手都有一些容易搞错的点.这里权做一点记录. 锁的是代码还是对象? 同步块一般有两种写法. 1是直接加以方法体上 ...
- css设置边框四角样式
开发中使用css 伪类 是再常见不过的事情了,运用好了能轻松实现许多复杂的样式,大大减少使用图片消耗带宽的问题,今天我们就使用伪类来实现登录框的四角样式 html代码如下 <div class= ...
- Ascend C sqrt算子实战
摘要:编写一个Ascend C的sqrt算子,并通过内核调用方式在cpu和npu模式下进行验证. 本文分享自华为云社区<[2023 · CANN训练营第一季]--Ascend C sqrt算子实 ...
- 文件系统考古2:1984 - BSD Fast Filing System
今天继续与大家分享系列文章<50 years in filesystems>,由 KRISTIAN KÖHNTOPP 撰写. 我们将进入文件系统的第二个十年,即1984年,计算机由微型计算 ...
- Reactor 模式与Tomcat中的Reactor
系列文章目录和关于我 参考:[nio.pdf (oswego.edu)](https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf) 一丶什么是Reactor Th ...
- SQL SERVER 查看表说明,字段属性
查询表字段属性,说明等: 1 SELECT 2 表名=case when a.colorder=1 then d.name else '' end, 3 表说明=case when a.colorde ...
- 一文了解 io.Copy 函数
1. 引言 io.Copy 函数是一个非常好用的函数,能够非常方便得将数据进行拷贝.本文我们将从io.Copy 函数的基本定义出发,讲述其基本使用和实现原理,以及一些注意事项,基于此完成对io.Cop ...
- Open LLM 排行榜近况
Open LLM 排行榜是 Hugging Face 设立的一个用于评测开放大语言模型的公开榜单.最近,随着 Falcon 的发布并在 Open LLM 排行榜 上疯狂屠榜,围绕这个榜单在推特上掀起了 ...