Spring系统学习-什么是AOP?为啥使用AOP?

news2024/10/6 21:34:53

问题思考

我们为啥要使用AOP?
来看一个案例:

声明计算器接口Calculator,包含加减乘除的抽象方法

public interface Calculator {
    int add(int i, int j);
    int sub(int i, int j);
    int mul(int i, int j);
    int div(int i, int j);
}

在这里插入图片描述

public class CalculatorPureImpl implements Calculator {
    @Override
    public int add(int i, int j) {
        int result = i + j;
        System.out.println("方法内部 result = " + result);
        return result;
    }
    @Override
    public int sub(int i, int j) {
        int result = i - j;
        System.out.println("方法内部 result = " + result);
        return result;
    }
    @Override
    public int mul(int i, int j) {
        int result = i * j;
        System.out.println("方法内部 result = " + result);
        return result;
    }
    @Override
    public int div(int i, int j) {
        int result = i / j;
        System.out.println("方法内部 result = " + result);
        return result;
    }
}

创建带日志功能的实现类
在这里插入图片描述

public class CalculatorLogImpl implements Calculator {
    @Override
    public int add(int i, int j) {
        System.out.println("[日志] add 方法开始了,参数是:" + i + "," + j);
        int result = i + j;
        System.out.println("方法内部 result = " + result);
        System.out.println("[日志] add 方法结束了,结果是:" + result);
        return result;
    }
    @Override
    public int sub(int i, int j) {
        System.out.println("[日志] sub 方法开始了,参数是:" + i + "," + j);
        int result = i - j;
        System.out.println("方法内部 result = " + result);
        System.out.println("[日志] sub 方法结束了,结果是:" + result);
        return result;
    }
    @Override
    public int mul(int i, int j) {
        System.out.println("[日志] mul 方法开始了,参数是:" + i + "," + j);
        int result = i * j;
        System.out.println("方法内部 result = " + result);
        System.out.println("[日志] mul 方法结束了,结果是:" + result);
        return result;
    }
    @Override
    public int div(int i, int j) {
        System.out.println("[日志] div 方法开始了,参数是:" + i + "," + j);
        int result = i / j;
        System.out.println("方法内部 result = " + result);
        System.out.println("[日志] div 方法结束了,结果是:" + result);
        return result;
    }
}

这个时候我们发现代码缺陷:

  • 对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力
  • 附加功能分散在各个业务功能方法中,不利于统一维护

解决这两个问题,核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。

解决问题的困难:要抽取的代码在方法内部,靠以前把子类中的重复代码抽取到父类的方式没法解决。所以需要引入新的技术。

这其实就是我们的AOP思想 - 解耦

AOP概述

Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的支持。它允许开发者通过定义切面(Aspect)来将横切关注点(Cross-cutting Concerns)与核心业务逻辑分离,从而提高代码的可维护性和可重用性。

在Spring AOP中,切面是一个模块化的单元,它横跨多个类和对象,用于封装横切关注点。横切关注点是那些在应用程序中散布在各处的功能,如日志记录、事务管理、安全性等,它们与核心业务逻辑无关,但又需要在多个地方重复使用。

Spring AOP通过使用代理模式和动态代理技术,在运行时动态地将切面织入到目标对象的方法中,从而实现横切关注点的功能。开发者可以使用注解或XML配置来定义切面和切点,以及指定切面的行为和执行时机。

Spring AOP的核心概念包括:

  • Aspect(切面):封装了横切关注点的模块。一个切面是由多个join points和相关的advice组成。

  • Join Point(连接点):在程序执行过程中的某个点,如方法调用或异常抛出,可以被AOP织入的地方。

  • Advice(通知):在特定的join point执行的代码,如before、after、around等类型的通知。

  • Pointcut(切入点):一个或多个join points的集合,通过表达式语言来定义哪些join points会被编织上advice。

  • Weaving(织入):将aspect和advice插入到程序的join points的过程,Spring AOP在运行时通过代理实现这一点。

  • Target Object(目标对象):被通知的对象,即被AOP增强的真实对象。

  • Proxy(代理):包含目标对象以及附加的AOP行为的对象。

Spring AOP主要通过两种代理机制实现AOP:

  • JDK动态代理:用于实现接口的代理,利用Java反射机制创建代理对象。

  • CGLIB(Code Generation Library):用于实现类的代理,通过字节码生成库来创建子类对象。

通过使用Spring AOP,开发者可以更容易地维护和扩展应用,因为那些与业务逻辑无关的代码可以被集中管理和修改,而不必改动核心的业务逻辑代码。这有助于降低系统复杂度,提高代码的可读性和可维护性。

为啥Spring 要使用AOP?

Spring框架选择使用AOP(Aspect Oriented Programming,面向切面编程)的主要原因在于解决传统面向对象编程(OOP)中遇到的一些挑战,特别是在处理横切关注点(cross-cutting concerns)方面。下面列出了一些关键的原因:

  • 解耦合:在OOP中,横切关注点(如日志记录、缓存、权限检查、事务管理等)常常需要在多个地方重复编码,这导致代码耦合度高,难以维护和扩展。AOP允许将这些关注点从核心业务逻辑中分离出来,降低系统的耦合度。

  • 代码重用和模块化:通过AOP,你可以编写一次横切关注点的代码,并在多个不同的地方使用它,无需在每个受影响的模块中重复相同的代码。这提高了代码的重用性和模块化。

  • 简化开发和维护:AOP使得开发人员可以专注于业务逻辑的实现,而将通用的服务(如日志、事务管理)留给AOP切面处理。这不仅简化了开发流程,也便于后期维护,因为所有的日志或事务相关代码都集中在一个地方。

  • 透明性:使用AOP,可以向现有代码添加新的功能,而无需修改原有代码。例如,如果需要在所有数据库操作前后添加日志记录,可以通过AOP轻松实现,而不需要修改每个涉及数据库操作的方法。

  • 灵活的配置:Spring AOP允许通过XML配置文件或者注解来定义切点(pointcuts)、通知(advice)和切面(aspects),这提供了非常灵活的配置选项,使得开发者可以根据需要轻松调整AOP的行为。

  • 事务管理:Spring AOP特别擅长处理事务管理。通过声明式事务管理,开发者只需在配置文件或注解中指定事务边界,而不需要在代码中显式地管理事务的开始和结束。

  • 性能优势:虽然AOP引入了额外的运行时开销,但由于它减少了代码的重复和耦合,总体上可以带来更好的性能,尤其是在大型企业级应用中。

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

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

相关文章

HNU电子测试平台与工具2_《计算机串口使用与测量》

(这个有留word哈哈) 4.1 4.2 Linux 操作系统平台 一、实验目的 了解 Linux 系统文件系统的基本组织了解 Linux 基本的多用户权限系统熟练使用 ls、cd、cat、more、sudo、gcc、vim 等基本命令会使用 ls 和 chmod 命令查看和修改文件权限 二、实…

使用机器学习,通过文本分析,轻松实现原本复杂的情感分析

01、案例说明 本期分享案例是:文字分析-情感分析,内容是关于某部电影评论好坏的分析,使用大量的已知数据,通过监督学习的方法,可以对于未知的评论进行判断其为正面还是负面的评价。 对于数据分析,原来都是…

contrastive loss and triplet loss

contrastive loss 想要positive pair 的距离接近0 而triplet loss只需要postive pair的距离 和 negtaive pair 的距离相差m以上, postive pair的距离不一定为0, 所以条件更松驰, 为网络训练更友好一点 reference: https://www.youtube.com/watch?vBcF6FfZHDqA

图书管理系统(含登录验证码操作)

文章目录 登录需求分析登录界面注册功能:登录功能:忘记密码:验证码规则: 图书管理系统需求Book包Book类BookList类 IOperation包IOperation接口查找图书新增图书删除图书显示图书借阅图书归还图书退出系统 User包user类Users类adm…

【Java】如果让你设计一个分布式链路跟踪系统?你怎么做?

一、问题解析 分布式链路跟踪服务属于写多读少的服务,是我们线上排查问题的重要支撑。我经历过的一个系统,同时支持着多条业务线,实际用上的服务器有两百台左右,这种量级的系统想排查故障,难度可想而知。 因此&#…

大数据------JavaWeb------JSP(完整知识点汇总)

JSP 定义 JSP(Java Server Pages),即Java服务端页面。它是一种动态的网页技术,其中可以定义HTML、CSS、JS等静态内容,还可以定义Java代码的动态内容JSP HTML Java 说白了JSP就是一个页面,它既可以写HTML标…

昇思第8天

保存与加载 保存模型使用save_checkpoint接口,传入网络和指定的保存路径 要加载模型权重,需要先创建相同模型的实例,然后使用load_checkpoint和load_param_into_net方法加载参数。 使用静态图加速 AI编译框架分为两种运行模式&#xff0c…

红酒与建筑:品味历史与艺术的交汇

在时间的长河中,红酒与建筑都是人类智慧的结晶,它们各自承载着历史的厚重与艺术的韵味。当这两者交汇时,仿佛是一场穿越时空的对话,将我们带入一个既古老又现代、既深沉又温柔的世界。今天,就让我们一起走进这个奇妙的…

鸿翼FEX文件安全交换系统,打造安全高效的文件摆渡“绿色通道”

随着数字经济时代的到来,数据已成为最有价值的生产要素,是企业的重要资产之一。随着数据流动性的增强,数据安全问题也随之突显。尤其是政务、金融、医疗和制造业等关键领域组织和中大型企业,面临着如何在保障数据安全的同时&#…

Windows11 安装MySQL

MySQL下载官网 安装教程参考 选择Windows离线安装 典型安装

springboot大学生请假管理系统-计算机毕业设计源码17453

摘 要 从20年代开始,计算机疯狂的出现在人们的生活以及工作当中,成为人们生活、工作的好帮手,计算机深入到每家每户当中,网络办公,网络教学更是替换了传统手工记录管理的方式,使用计算机办公可以不必局限于…

3D模型如何在力控组态中打开?---模大狮模型网

在展览3D模型设计行业中,力控组态是一个关键的技术应用。通过适当的力控组态,可以实现模型的互动性和真实感,提升展览效果和用户体验。本文将探讨如何在力控组态中打开和应用3D模型,从而达到更加生动和引人入胜的展示效果。 一、了…

Linux文件与日志

目录 1. Linux 文件系统 1.1 inode号 1.2 EXT类型文件恢复 1.3 xfs类型文件备份和恢复 2. 日志分析 2.1 日志类型 2.2日志配置文件 2.3 日志分析的重要性 在Linux系统中,文件和日志是管理和维护系统运行所不可或缺的。理解它们的工作原理和如何有效地管理和…

民宿小程序开发,在线预订模式

一、开发背景 如今,随着互联网技术的快速发展,大众的生活消费都集中在了手机上,通过手机进行各种活动,同时也包括了预订酒店民宿,由此,民宿预约小程序出现在了大众的生活中。 二、民宿小程序特点 民宿小…

the problem when using langchain chat openai model and crewai same llm models

题意: when i am using langchain chat openai model and invoking method its working but when using in crewai same llm models it gives invalid api key 当你提到在使用 langchain 的 chatopenai 模型并调用方法时一切正常,但在 crewai 中使用相…

MySql Innodb 索引有哪些与详解

概述 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B树结构,可以加速SQL查询。但对于B树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从…

Python入门 2024/7/3

目录 for循环的基础语法 遍历字符串 练习:数一数有几个a range语句 三个语法 语法1 语法2 语法3 练习:有几个偶数 变量作用域 for循环的嵌套使用 打印九九乘法表 发工资案例 continue和break语句 函数的基础定义语法 函数声明 函数调用 …

数字化时代的新型共赢商业模式

在数字化时代的洪流中,一种名为“双轨订单协同增效模式”的新型商业架构正悄然兴起,它以别出心裁的理念和运作机制,在市场中开辟出了一片新天地。 一、模式概览 “双轨订单协同增效模式”根植于用户间的协同合作与订单流转优化。用户通过加入…

Ansys Maxwell 2024 R2更新介绍

Ansys Maxwell 2024 R2更新概览 具体更新介绍 01 Continuum Air [Beta] 02 New Power Electronics Solver 03 Combination of DC & AC Fields 04 More Features: More Capabilities…

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

视图库对接系列(本级)注册 在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。 GA-T 1400中的步骤如下: 这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话&…