什么是 AOP?对于 Spring IoC 和 AOP 的理解?Spring AOP 和 AspectJ AOP 有什么区别?

news2024/11/13 9:27:05

什么是 AOP?

AOP(Aspect-Oriented Programming),即 面向切面编程,

它与OOP( ObjectOriented Programming, 面向对象编程) 相辅相成,提供了与OOP 不同的抽象软件结构的视角

OOP 中, 我们以类(class)作为我们的基本单元

AOP 中的基本单元是 Aspect(切面)

对于 Spring IOC 和 AOP 的理解?

IOC

IOC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

IOC 在其他语言中也有应用,并非 Spring 特有。

IOC 容器是 Spring 用来实现 IOC 的载体,IOC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

对象之间的相互依赖关系交给IOC 容器来管理,并由 IoC 容器完成对象的注入,简化开发。

IOC 容器就像是一个工厂一样,当需要创建一个对象的时候, 只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 在实际项目中一个 Service 类可能有几百甚至上千个类作为它的底层, 假如我们需要实例化这个 Service,可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用IOC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

Spring 时代一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

Spring IOC 初始化过程

xml--读取-->Resource--解析-->BeanDefinition--注册-->BeanFactory

IOC 源码阅读:

https://javadoop.com/post/spring-ioc

AOP

AOP(Aspect-Oriented Programming:面向切面编程)

能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权 限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP就是基于动态代理的,

如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,

这时候Spring AOP会使用 Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:

当然也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ,AspectJ 是 Java 生态系统中最完整的 AOP 框架了。

使用 AOP 之后可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性,日志功能、事务管理等等场景都用到了 AOP 。 

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 编译时增强

Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架

AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果切面比较少,那么两者性能差异不大。

当切面太多的话, 最好选择 AspectJ ,它比Spring AOP 快很多

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

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

相关文章

Zynq 多个UDP客户端组网启动问题(Auto negotiation error)PS:附UDP客户端初始化代码

最近正在进行一个Zynq项目,根据设计需求,需要将上位机作为UDP服务器,而FPGA则充当UDP客户端。同时,服务器需要能够接收和控制多个UDP客户端。 开发过程中,我是基于lwip UDP Perf Client 官方模版开发的。我遇到了以下几…

重磅!高通大客户「跳单」,智能座舱SoC赛道进入「混战期」

哪家车企是高通座舱芯片的最大客户?答案不是蔚来、理想、小鹏等智能化布局领先的新势力,而是比亚迪。 高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)乘用车智能座舱前装标配高通芯片交付367.45万辆&…

DALL·E2(unCLIP)、Stable Diffusion、IS、FID要点总结

DALLE 1 DALLE 1可以看成是VQ-VAE和文本经过BPE编码得到的embedding AE(Auto Encoder) encoder decoder结构,AE在生成任务时只会模仿不会创造,所有有了后面的VAE VAE(Variational AutoEncoder) 不再学习固定的bottleneck特征…

2023-07-07-liunx环境,python调用ITK(c++版本)批量生成Drr

文章目录 一、前言二、配置过程2.1.CMake与ITK的配置2.2.改写ITK的生成drr代码2.3.编译代码2.4.python调用cpp 三、总结四、参考博客 一、前言 最近在做配准,需要用ITK来生成数据,windows版本可以通过cmake与visual studio可以跑通生成。但是想要在linu…

纯干货,全文手码:如何利用低/无代码平台建立集团信息化系统

信息化系统是企业管理体系的延伸 对于一家集团企业而言,要实现信息化,首先需要考虑是否已经建立了完备的信息化管理制度。早在上世纪九十年代卡特彼勒引入了6 Sigma,使整个集团公司的运营规范化、系统化。通过多年的实践积累,卡特…

【雕爷学编程】Arduino动手做(157)---MX1508双路电机驱动模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

计算机视觉:通过边缘检测探究卷积的特征提取功能

本文重点 在前面的课程中,我们学习了卷积核的运算,同时我们也学习了卷积核的含义,我们可以将卷积核理解为特征提取器,也就是说一个卷积核就是一个特征提取器,很多人对这种说法不了解,下面我们就通过一个边缘检测的例子来看一下卷积核是如何进行边缘特征的提取的。 什么…

[ICML 2023] Fast inference from transformers via speculative decoding

Contents IntroductionSpeculative DecodingStandardized SamplingSpeculative Sampling AnalysisNumber of Generated TokensCalculating α \alpha αWalltime ImprovementNumber of Arithmetic OperationsChoosing γ \gamma γ ExperimentsReferences Introduction 为了…

springboot+vue膳食营养健康网站零食美食品商城_4d8g9

随着社会的不断进步与发展,人们对生活质量要求逐步提升。如果开发一款膳食营养健康网站,可以让用户在最短的时间里享受到最好的服务;而开发本网站,又能够提高网站整体工作水平,简化工作程序,这对管理员和用…

北京“数据二十条”发布,筑牢数据安全根基,加速释放数据产能

要实现2000亿的目标,基础保障如何做好? 7月5日,中共北京市委、北京市人民政府印发《关于更好发挥数据要素作用进一步加快发展数字经济的实施意见》(《实施意见》分为9个部分,共涉及20项具体任务,也被称作“…

TypeScript 中的 enum 枚举类型的使用解读。

前言 在 TypeScript 中,新增了很多具有特性的一些数据类型处理方法,enum 【枚举】就是其中,很具有代表性的一种,所以本章节就来聊聊 在 TypeScript 中如何去运用 enum 【枚举】。 枚举得的概念: 枚举(Enum&…

Web前端工程师笔试题(合集)

Web前端开发工程师笔试题篇1 1. 在一个框架的属性面板中,不能设置下面哪一项。( C ) A.源文件 ; B.边框颜色 ; C.边框宽度 D.滚动条 2. CSS样式表根据所在网页的位置,可分为?(B ) A.行内样式表、内嵌样式表、混合样式表 B.行内样式表、内嵌样式表…

MySQL数据库——多表查询练习2

一、练习素材 创建表 --创建部门表dept create table dept ( dept1 int , dept_name varchar(11));--创建员工表emp create table emp ( sid int , name varchar(11), age int, worktime_start date, incoming int, dept2 int); 插入数据 --部门表插入数据 insert into dep…

C++ 栈和队列(stack and queue)语法使用及底层实现原理

本篇文章会对C中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助! 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法…

C++ 线程池实现

思路 创建多个工作线程同时维护一个公共的任务队列, 任务队列非空时通过信号量唤醒阻塞等待的工作线程, 工作线程通过互斥锁互斥的从任务队列中取出任务, 然后执行任务 实现 信号量类 class sem {//封装信号量类 public:sem(int num 0) {if (sem_init(&m_sem, 0, num)…

Kernel-Pwn-FGKASLR保护绕过

FGKASLR FGASLR(Function Granular KASLR)是KASLR的加强版,增加了更细粒度的地址随机化。因此在开启了FGASLR的内核中,即使泄露了内核的程序基地址也不能调用任意的内核函数。 layout_randomized_image 在fgkaslr.c文件中存在着…

支持中文手写和多画布的Handraw

什么是 Handraw ? Handraw 是支持中文手写和多画布的 Excalidraw 白板工具。 官网上项目名称还是 Excalidraw-CN,所以 Handraw 应该是基于 Excalidraw 二开的,特点是支持中文手写字体和多画布 官方也提供了免费使用的站点:https://handraw.t…

ModaHub魔搭社区:向量数据库Zilliz Cloud插入 Entity教程

目录 开始前 插入单个 Entity 批量插入 Entity 准备数据 插入数据 写入操作 本文介绍如何将 Entity 插入到 Zilliz Cloud 集群中的 Collection。 Entity 是 Collection 中的基本数据单元。同一个 Collection 中的 Entity 具有相同的属性,这些属性共同定义在 Schema 中…

低代码开发平台助力解决企业开发效率问题

编者按:随着企业应用需求的不断增加,提高企业开发效率已经成为许多企业的目标。传统的开发方法显然不适用,开发平台通过可视化拖拉拽搭建等易用性和高扩展性可以帮助企业解决这个问题。 关键词:可视化开发、私有化部署、前后端分离…

设计模式--------行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间…