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概述的更多相关文章

  1. Spring 的 AOP 概述和底层实现

    Spring 的 AOP 概述和底层实现 1. 什么是 AOP AOP (Aspect Oriented Programing),即面向切面编程 AOP 采取横向抽取机制,取代了传统纵向继承体系重复性 ...

  2. 10 Spring框架 AOP (三) Spring对AspectJ的整合

    上两节我们讲了Spring对AOP的实现,但是在我们的开发中我们不太使用Spring自身的对AOP的实现,而是使用AspectJ,AspectJ是一个面向切面的框架,它扩展了Java语言.Aspect ...

  3. 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 ...

  4. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  5. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  6. Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建

    上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...

  7. Spring技术内幕总结 - AOP概述

    AOP是Aspect-Oriented Programming(面向方面/切面编程)的简称.Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.分离关注点使解决特定领域问题的 ...

  8. Spring框架的核心功能之AOP概述

    1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 ...

  9. Spring之二:Spring AOP概述

    一.AOP概念回顾 AOP是Aspect-Oriented Programming(面向方面编程)的简称, 虽然可以利用面向对象的方法可以很好地组织代码,也可以通过继承关系实现代码重用,但是程序中总是 ...

  10. Spring源码剖析6:Spring AOP概述

    原文出处: 五月的仓颉 我们为什么要使用 AOP 前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring AOP的时候写的,比较基础.这篇文章最后的推荐以及回复认为我写的对大 ...

随机推荐

  1. 2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么?

    2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么? 福哥答案2021-03-05: 这是面试中被问到的.实力 ...

  2. 2021-09-06:给表达式添加运算符。给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有

    2021-09-06:给表达式添加运算符.给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+.- 或 * ,返回所有 ...

  3. Redis的三种持久化策略及选取建议

    概述 Redis是一个基于内存的高性能的键值型数据库,它支持三种不同的持久化策略:RDB(快照).AOF(追加文件).混合.这三种策略各有优缺点,需要根据不同的场景和需求进行选择和配置.本文将介绍这三 ...

  4. 2015年蓝桥杯C/C++大学B组省赛真题(星系炸弹)

    题目描述: 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在 ...

  5. 500行代码手写docker-实现硬件资源限制cgroups

    (5)500行代码手写docker-实现硬件资源限制cgroups 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一 ...

  6. HashMap 以及多线程基本感念

    接口 Map :映射项,(键值对 ) 的容器注意: 键 是唯一的 值 是可以重复的实现类 HashMap :哈希表结构 允许使用null值 和 null 键 线程不安全 键唯一 无序 linkedHa ...

  7. SCI 投稿中像素、DPI、图片分辨率的一些知识

    最近在学习 Linux 命令行下的 ImageMagick 图像处理,对图像本身的一些概念有点懵,搜集整理了一点资料,仅供自己和大家学习与参考. SCI 期刊对分辨率大多都有一定的要求,例如一段来自 ...

  8. spring cloud gateway网关(一)之网关路由

    1.gateway相关介绍 在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房.不同地区.不同域名下.这种情况下,客户端(例如浏览器.手机.软件工具等)想要直接请求这些服务,就需要 ...

  9. LeetCode 双周赛 107(2023/06/24)滑动窗口与离散化

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP ...

  10. JVM之指针压缩

    做java开发的同学一般都比较熟悉JVM,那么关于指针压缩这块内容是不是也了解呢,不熟悉的小伙伴往下看吧. 首先说明,本文涉及的JDK版本是1.8,JVM虚拟机是64位的HotSpot实现为准. ja ...