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. 解决:Invalid HTTP_HOST header: '192.168.56.1:8001'. You may need to add '192.168.56.1' to ALLOWED_HOSTS.

    在setting.py下的ALLOWED_HOSTS=['*']添加'*'就可以解决显示不出来的问题.

  2. TestForPicGo

    如果显示,则为成功 否则,失败 同时为CN-BLOG的vscode插件进行测试

  3. L1-025 正整数A+B (15 分)

    1.题目描述: 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A ...

  4. antd 在webpack.config配置主题色

    虽然官方提供了craco-less 来 覆盖less-loader 提供的 less 变量,但自己也想试着修复config来配置一下 首先需要运行 yarn eject 来暴露webpack的配置 其 ...

  5. MYSQL数据库的创建和删除

    打开Windows命令行,输入登录用户和密码 mysql -h localhost -u root -p 创建新数据 CREATE DATABASE zoo; 查看系统中的数据库 SHOW DATAB ...

  6. 新风向标:学术界开始从 Python 转向 Rust

    作者 | Jeffrey M. Perkel 策划 | Tina 来源 | Rust语言中文社区 Rust 现在已经越来越受到科学家们的欢迎了,比起 Python,Rust 有着更高效的性能,同时在社 ...

  7. CentOS Linux 7 安全基线设置

    作为一个生信人,不管是日常的数据分析还是其他工具应用的开发,服务器的安全始终是一个无法避免的话题.尤其是当我们拿到一台新的服务器,我们需要怎样才能确保它是安全可靠,并最小限度降低它被攻击的可能性? 下 ...

  8. 【HMS Core】Android Studio安装Toolkit登录报错{"httpCode":500,"errorCode":"00012005"...

    [问题描述] 在Android Studio安装Toolkit插件,安装后登录,报错 ​ ​ [问题分析] 此种情况一般是由于开发者账户未实名造成的 [解决方案] 1.检查开发者账户是否实名,登录联盟 ...

  9. boot 项目启动:Error starting ApplicationContext. To display the conditions report re-run

    Error starting ApplicationContext. To display the conditions report re-run 问题描述 boot 工程启动不了 原因分析: 以后 ...

  10. celery笔记五之消息队列的介绍

    本文首发于公众号:Hunter后端 原文链接:celery笔记五之消息队列的介绍 前面我们介绍过 task 的处理方式,将 task 发送到队列 queue,然后 worker 从 queue 中一个 ...