Spring核心思想之IOC和AOP

news2024/10/5 21:21:13

IOC和AOP不是Spring提出的,在spring之前就已经存在,只不过更偏向于理论化,Spring在技术层次把这两个思想做了⾮常好的实现(Java)。

Spring核心思想

    • IOC(Inversion of Control)
      • 什么是IoC?
      • IoC解决了什么问题
      • IoC和DI的区别
    • AOP(Aspect oriented Programming)
      • 什么是AOP
      • AOP在解决什么问题
      • 为什么叫做⾯向切⾯编程
      • AOP 的底层实现
      • AOP 的动态代理技术
        • JDK 的动态代理
        • cglib 的动态代理
      • AOP 相关概念
      • 常见应用场景

IOC(Inversion of Control)

什么是IoC?

IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现。
描述的事情:Java开发领域对象的创建,管理的问题
传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象
IoC思想下开发⽅式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可。
我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列事情)
为什么叫做控制反转?
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)
在这里插入图片描述

IoC解决了什么问题

IoC解决对象之间的耦合问题
在这里插入图片描述

IoC和DI的区别

DI:Dependancy Injection(依赖注⼊)
怎么理解:
IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样罢了。
在这里插入图片描述

AOP(Aspect oriented Programming)

什么是AOP

AOP: AOPAspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOPOOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
既然AOP是OOP的延续,我们从OOP说起,OOP全称Object-Oriented Programming(面向对象编程)。OOP是一种常用的编程范式,它以对象为核心,通过封装继承多态等概念来组织和管理代码。面向对象编程提供了一种结构化和模块化的方法,使得我们能够更好地组织和复用代码。
OOP是⼀种垂直继承体系。
在这里插入图片描述
OOP编程思想可以解决⼤多数的代码重复问题,但是有⼀些情况是处理不了的,⽐如在顶级⽗类Animal中的多个⽅法中相同位置出现了重复代码,OOP就解决不了
在这里插入图片描述
横切逻辑代码:
在这里插入图片描述
横切逻辑代码存在什么问题:

  • 横切代码重复问题
  • 横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不⽅便

AOP出场,AOP独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离。
在这里插入图片描述
代码拆分容易,那么如何在不改变原有业务逻辑的情况下,悄⽆声息的把横切逻辑代码应⽤到原有的业务逻辑中,达到和原来⼀样的效果,这个是⽐较难的。

AOP在解决什么问题

在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

为什么叫做⾯向切⾯编程

「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑
「⾯」:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个⾯的概念在⾥⾯。

AOP 的底层实现

实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。

AOP 的动态代理技术

常用的动态代理技术

  • JDK 代理 : 基于接口的动态代理技术
  • cglib 代理:基于父类的动态代理技术
    在这里插入图片描述

JDK 的动态代理

JDK的动态代理实现如下:

  1. 创建目标类接口:
public interface TargetInterface {
   public void method();
}
  1. 目标类
public class Target implements TargetInterface {
    @Override
    public void method() {
        System.out.println("Target running....");
    }
}
  1. 动态代理代码
Target target = new Target(); //创建目标对象
//创建代理对象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass()
.getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) 
            throws Throwable {
                System.out.println("前置增强代码...");
                Object invoke = method.invoke(target, args);
                System.out.println("后置增强代码...");
                return invoke;
            }
        }
);
  1. 调用代理对象的方法测试验证:
// 测试,当调用接口的任何方法时,代理对象的代码都无序修改
proxy.method();

输出如下:
在这里插入图片描述

cglib 的动态代理

cglib 的动态代理实现如下:

  1. 创建目标类:
public class Target {
  public void method() {
      System.out.println("Target running....");
  }
}
  1. 动态代理代码
Target target = new Target(); //创建目标对象
Enhancer enhancer = new Enhancer();   //创建增强器
enhancer.setSuperclass(Target.class); //设置父类
enhancer.setCallback(new MethodInterceptor() { //设置回调
    @Override
    public Object intercept(Object o, Method method, Object[] objects, 
    MethodProxy methodProxy) throws Throwable {
        System.out.println("前置代码增强....");
        Object invoke = method.invoke(target, objects);
        System.out.println("后置代码增强....");
        return invoke;
    }
});
Target proxy = (Target) enhancer.create(); //创建代理对象
  1. 调用代理对象的方法测试
//测试,当调用接口的任何方法时,代理对象的代码都无序修改
proxy.method();

默认情况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还是CGLIB。当被代理对象没有实现任何接⼝时,Spring会选择CGLIB当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术,不过我们可以通过配置的⽅式,让Spring强制使⽤CGLIB

AOP 相关概念

Spring 的 AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。

后续我会讲解AOP的操作,在此之前我们必须理解 AOP 的相关术语,常用的术语如下:

  • Target(目标对象):代理的目标对象
  • Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
  • Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
  • Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知
  • Aspect(切面):是切入点和通知(引介)的结合
  • Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

常见应用场景

  1. 日志记录:AOP可用于在方法调用前后记录日志。这对于系统的调试、错误排查以及性能分析都非常有用。通过在切面中编写日志记录逻辑,可以捕获方法的参数、返回值和执行时间等信息,并将其记录到日志文件或其他目标中。
  2. 安全性控制:AOP可用于实现安全性控制,如身份验证、权限验证和访问控制等。通过在切面中编写安全性逻辑,可以在方法调用前检查用户的身份和权限,从而确保只有合法用户才能执行敏感操作。
  3. 事务管理:AOP广泛应用于事务管理,确保数据库操作的一致性和完整性。通过在切面中应用事务逻辑,可以在方法调用前后自动开启、提交或回滚事务。这样,开发者无需手动编写事务管理代码,而是将关注点集中在业务逻辑上。
  4. 缓存管理:AOP可用于实现缓存管理,提高系统的性能和响应速度。通过在切面中添加缓存逻辑,可以在方法执行前检查缓存是否包含所需数据,避免执行相同的方法调用。如果缓存中存在数据,则直接返回缓存数据,减少对底层存储系统的访问。
  5. 异常处理:AOP可用于捕获和处理方法调用过程中的异常情况。通过在切面中编写异常处理逻辑,可以记录异常信息、发送通知或执行特定的异常处理策略。这有助于更好地理解和响应系统中发生的异常情况。
  6. 性能监控:AOP可用于监控方法的性能指标,以便进行性能分析和优化。通过在切面中添加性能监控逻辑,可以记录方法的执行时间、调用次数和资源消耗等指标。这样可以识别系统中的性能瓶颈,并采取相应的优化措施。

总之,Spring AOP提供了一种模块化的方式来处理横切关注点,使开发者能够更好地关注核心业务逻辑。通过在切面中编写特定的逻辑,可以在方法调用的不同阶段插入通用的横切行为,提高代码的可维护性和重用性

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unittest单元测试框架

目录 前言: 一、unittest模块的各个属性说明 二、使用unittest框架编写测试用例思路 三、使用unittest框架编写测试用例实例 前言: unittest是Python自带的单元测试框架,可以用于编写和执行单元测试。 一、unittest模块的各个属性说明 …

Linux内核4.14版本——drm框架分析(9)——DRM_IOCTL_MODE_GETCONNECTOR(drm_mode_getconnector)

目录 1. drm_mode_getconnector分析 1.1 找到connector 1.2 计算该connector的encoder数量 1.3 把connector支持的encoder和数量返回给用户 1.4 把找到的connector的参数返回给应用 1.5 填充mode(很重要) 1.6 把找到的connector的参数返回给应用 …

excel爬虫相关学习2:excel 和 vba 爬虫相关xmlhttp方法

目录 前言:vba 爬虫相关xmlhttp的方法 1 什么是xmlhttp 1.1 定义 1.2 特点 定义XMLHTTP对象: XMLHTTP方法: open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword) send(varBody) setRequestHeader(bstrHeader, bstrValue) …

Java 被挤出前三。。

TIOBE 2023 年 06 月份的编程语言排行榜已经公布,官方的标题是:Python 还会保持第一吗?(Will Python remain number 1?) 在过去的 5 年里,Python 已经 3 次获得 TIOBE 指数年度大奖,这得益于…

简述Spring中IOC核心流程

基础概念 IOC 和 DI IOC,即控制反转。是Spring的一种设计思想。传统程序设计中,我们创建一个对象是通过 new 关键字,是程序主动去创建依赖对象,而在spring中专门有一个容器来创建和管理这些对象,并将对象依赖的其他对…

rpm详解——原理,命令详细讲解

目录 三个问题 什么是RPM SRPM (Source RPM) RPM软件包 RPM 查询命令 查询已安装的RPM软件信息 查询文件/目录属于哪个RPM软件 查询未安装的RPM包文件 RPM 软件包的安装、卸载 安装 卸载 RPM 升级与更新 三个问题 先抛出三个问题,最后简单解释一下。 …

HiveSQL 电商场景TopK统计

数据准备 CREATE TABLE test.test2 ( user_id string, shop string ) ROW format delimited FIELDS TERMINATED BY \t; INSERT INTO TABLE test.test2 VALUES ( u1, a ), ( u2, b ), ( u1, b ), ( u1, a ), ( u3, c ), ( u4, b ), ( u1, a ), ( u2, c ), ( u5, b ), ( u4, b )…

基于人工智能的AI理发师能帮托尼老师做什么?

BarberGPT是一个人工智能理发师,它可以让您在照片上尝试不同的发型。您只需要上传您的照片,标记您的头发,然后就可以看到惊人的变化。BarberGPT使用了先进的深度学习技术,可以根据您的脸型、肤色和发质生成适合您的发型。BarberGP…

国产监控数据库产品lepus最新版学习和部署(V5.1)

目录 lepus是什么? 二进制安装(最新v5.1) 1.基础环境 2.安装NSQ 3.NSQ消息测试 4.安装lepus 5.初始化数据库 6.修改配置文件 7.启动服务组件 8.安装lepus-console 9.运行和访问控制台 lepus是什么? Lepus数据库监控系统…

Docker容器应用为工业连接提供了新选择

一 智能数据管理 Docker容器应用可灵活部署在异构计算平台上,且仅需占用少量的资源,这可为工业4.0提供一种新的数据集成方案。Docker容器应用程序是提供特定功能的小型软件模块,可在自动化领域中用于智能数据管理。而Softing推出的一个新产品…

简要介绍 | CUDA底层原理:加速高性能计算的关键技术

注1:本文系“简要介绍”系列之一,仅从概念上对CUDA的底层原理进行非常简要的介绍,不适合用于深入和详细的了解。 CUDA底层原理:加速高性能计算的关键技术 CUDA Refresher: The GPU Computing Ecosystem | NVIDIA Technical Blog 1…

通过SECS/GEM平台实现半导体设备与EAP系统互联

在半导体电子和光伏行业大量的设备需要通过SECS/GEM协议与EAP系统进行互联。 常见的设备互联需求主要分为以下几类: 1.生产过程自动化:设备通过EAP下发指令进行切换程序、条码或RFID标签采集、Foup自动加载与卸载、晶圆生产加工自动化,减少…

6 种方式读取 Springboot 的配置,老司机都这么玩(原理+实战)

从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑。 我整理了几种获取配置属性的方式,目的不仅是要让大家学会如何使用,更重要的是弄清配置加载、读取的底层…

Windows WSL子系统Ubuntu22.04安装Nvidia显卡驱动

最近在研究AI,如果在Linux系统中部署的话需要重装系统,有些麻烦,又不想折腾。所以闲置很久没研究的WSL又拿起来研究了,当然部署ai还需要显卡驱动的支持,就必须先安装显卡驱动。 还没有安装过WSL的童鞋可以看我之前发布…

在 javascript 中清除 canvas 画布

文章目录 在 JavaScript 中清除画布在 HTML 中使用 JavaScript 创建画布 我们使用 canvas 来绘制图形。 它提供了多种绘制的方法,如圆形、方框、文字、添加图片等,我们在使用canvas时需要清除它并在上面绘制。 本文介绍如何在 JavaScript 中清除画布。 …

LogicFlow:自定义 bpmn 用户节点(1)

切入正题之前,首先我们先了解下面板上面节点的几个重要属性,如下图: 虽然 logicflow 内置插件里面有用户节点(bpmn:userTask),但是你若是想实现下面这种形式,就需要自己重新写个节点了。 上面…

MongoDB_5.0.18下载及安装(CentOS7)

文章目录 MongoDB安装(Centos7)1、下载地址2、安装流程2.1 下载server包2.2 安装server包2.3 修改默认mongod.conf配置文件2.4 启动服务2.5 这样就可以通过远程工具进行链接使用,创建mongodb用户,详细请查看其他文档 3、分享远程工…

球王梅西的力量

这次阿根廷来中国参加友谊赛,场内场外都有很多值得大众思考的,无论是对主办方的各种吐槽,还是对球迷近乎疯狂的追星行为,又或者是疫情放开后,大众积压已久的情绪,好象以往国外球队来,无论是顶级…

Axure教程——滑动拼图解锁

本文将教大家如何用AXURE中的动态面板制作拼图解锁 一、效果 预览地址:https://74wxu6.axshare.com 二、功能 拖动图片到指定位置提示“验证成功”,如果没到指定位置则提示“验证没成功,请重新验证” 三、制作 1、制作拼图 加入底部验证图…

【Python 随练】乒乓球比赛名单

题目: 两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请编程序找出三队赛手的名单。 简介:…