Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程)。如果你对这两个概念仍感到困惑,别担心,本文将为你详细解答,并提供实际代码示例来帮助你理解。
什么是IOC?
控制反转(Inversion of Control,IoC) 是一种设计原则,它通过将对象的创建和管理交给Spring容器来实现解耦。这意味着在你的代码中,不再需要显式地创建对象,而是通过Spring提供的机制进行管理。
IOC的工作原理
在Spring的IoC中,最重要的概念就是依赖注入(Dependency Injection,DI)。通过依赖注入,Spring将对象之间的依赖关系在运行时进行管理。
依赖注入的方式
- 构造器注入:通过构造函数传递依赖。
- Setter注入:通过Setter方法设置依赖。
- 接口注入:通过接口提供依赖(较少使用)。
IOC的优点
-
降低耦合度:把组件之间的依赖关系交给容器管理,大大降低了系统的耦合度,提高了模块之间的灵活性,实现了更好的解耦。
-
提高可测试性:依赖注入使我们能够轻松替换掉依赖的实现类,从而提高了代码的可测试性,方便单元测试。
-
动态管理:Spring容器支持动态管理对象的生命周期,能够实现懒加载、单例模式等特性。
-
配置灵活性:大多数配置可以通过XML或注解方式灵活设定,易于修改和管理。
IOC示例
这里是一个简单的IOC示例,演示如何利用Spring容器管理对象:
// 定义一个接口
public interface UserService {void addUser(String username);
}// 实现这个接口
public class UserServiceImpl implements UserService {@Overridepublic void addUser(String username) {System.out.println("添加用户:" + username);}
}// Spring配置(XML方式)
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userService" class="com.example.UserServiceImpl"/>
</beans>// 使用代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
userService.addUser("Alice");
在上述示例中,我们定义了一个用户服务接口UserService
及其实现类UserServiceImpl
。通过Spring的XML配置,我们将UserServiceImpl
的实例交给Spring容器管理,并在需要的时候通过配置获取。
什么是AOP?
面向切面编程(Aspect-Oriented Programming,AOP) 是一种用于分离关注点的编程范式。AOP允许开发者在程序运行时动态地对代码进行横切关注(如日志、事务管理、安全控制)的描述和处理,而不需要修改业务逻辑代码。
AOP的核心概念
-
切面(Aspect):定义了横切关注的抽象,可以看作是一个模块化的横切逻辑。
-
连接点(Join Point):程序执行中的某个特定点,如方法的调用、异常的抛出等。
-
切入点(Pointcut):定义了一组连接点,用于指定横切逻辑的应用时机。
-
通知(Advice):具体的横切逻辑,如在某个方法执行前后添加行为。
-
目标对象(Target Object):被AOP增强的对象,包括业务逻辑类。
AOP的优点
-
分离关注点:通过将通用功能(如日志记录、事务管理)从业务逻辑中分离,AOP使代码更加清晰和可读。
-
代码复用:横切逻辑可以在多个地方复用,避免了在每个地方重复编写相关代码。
-
提高效率:通过在运行时进行增强,可以更加灵活地管理横切逻辑,从而提高开发效率。
-
控制流程:能够统一管理事务、日志等,极大地简化了复杂的操作。
AOP示例
以下是使用Spring AOP的简单示例,展示如何在方法调用时添加日志记录。
// 定义切面
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.UserService.addUser(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("调用方法:" + joinPoint.getSignature().getName());}
}// 修改UserService
@Service
public class UserServiceImpl implements UserService {@Overridepublic void addUser(String username) {System.out.println("添加用户:" + username);}
}// Spring配置(使用注解)
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {// Bean的定义
}
在这个示例中,我们定义了一个日志切面LoggingAspect
,它会在UserService.addUser
方法调用之前输出日志。当我们在服务中添加用户时,会自动调用切面中的逻辑。
结合MySQL的简单操作
为了让我们讨论的内容更加实用,我们可以结合MySQL数据库做一个简单的用户添加操作。假设我们要将新增的用户信息存储到数据库中,以下是一个基本的示例。
MySQL表结构
在你的数据库中创建一个简单的users
表来存储用户信息:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL
);
更新用户服务类实现数据库操作
我们将用户服务中的addUser
方法更新,以向MySQL数据库中插入用户:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate JdbcTemplate jdbcTemplate; // Spring提供的JDBC模板@Overridepublic void addUser(String username) {String sql = "INSERT INTO users (username) VALUES (?)";jdbcTemplate.update(sql, username);System.out.println("添加用户:" + username + "到数据库");}
}
在这个实现中,我们使用Spring的JdbcTemplate
来处理数据库操作。通过简单的SQL语句,我们将用户信息存储到users
表中。
完整应用示例
让我们把所有部分都结合在一起,创建一个简单的用户管理应用。
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainApp {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = context.getBean(UserService.class);userService.addUser("Alice");userService.addUser("Bob");}
}
AppConfig
类可用于配置Spring的上下文,定义数据源和其他Bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.core.JdbcTemplate;@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {@Beanpublic DriverManagerDataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/your_db");dataSource.setUsername("your_username");dataSource.setPassword("your_password");return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate() {return new JdbcTemplate(dataSource());}
}
请确保在pom.xml
中包含Spring、MySQL JDBC驱动和其他必需的依赖。
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.20</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version>
</dependency>
总结
Spring的IOC和AOP为Java开发带来了极大的便利,使得代码设计更加模块化、可维护。在实际开发中,掌握这些核心概念将帮助你构建出高效、易于管理的应用。通过IOC,我们可以轻松地管理对象的创建与依赖关系,从而降低耦合度。而AOP则让我们能够将横切关注与业务逻辑分离,提高代码可读性和重用性。
了解并掌握这些核心概念,将会让你的开发过程更加高效。如果你还没开始使用Spring,不妨试试把这些概念应用到你的项目中。当你深入理解这些技术之后,你会发现,Spring不仅仅是一个框架,更是一种帮助我们解放思想、提升开发质量的工具。快来一起探索Spring的神奇吧!
相关文章:
Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程&…...
第二百六十四节 JPA教程 - JPA查询日期参数示例
JPA教程 - JPA查询日期参数示例 我们可以在查询中使用日期类型值。 以下代码使用EntityManager创建具有两个参数的查询。 然后它传递两个日期类型值。 em.createQuery("SELECT e " "FROM Professor e " "WHERE e.startDate BETWEEN :start AND :en…...
Spring MVC的运行流程详解
Spring MVC作为一个广泛使用的框架,提供了灵活且强大的MVC架构支持。尤其在业务系统中,Spring MVC能够有效地处理大量并发请求,提供良好的用户体验。本文将详细讲解Spring MVC的运行流程,以电商交易系统为案例,帮助读者…...
判断有向图是否为单连通图的算法
判断有向图是否为单连通图的算法 算法描述伪代码C语言实现解释在图论中,单连通图(singly connected graph)是指对于图中的任意两个顶点 m 和 v,如果存在从 m 到 v 的路径,则该路径是唯一的。为了判断一个有向图是否为单连通图,我们需要确保从任意顶点出发,到任意其他顶点…...
php与python建站的区别有哪些
php与Python建站的区别: 1、语言层面Python的特性比php好,更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码,在php里每个请求都会被执行一次,Python不需要。虽然php可以通过缓存缩短这方面的差距…...
模型评估与验证:确保模型在未知数据上的表现----示例:使用K折交叉验证评估分类模型、房价预测问题使用K折交叉验证来评估一个线性回归模型的性能
模型评估与验证是机器学习流程中的关键步骤,它帮助我们了解模型在未见过的数据上的泛化能力。交叉验证(Cross-Validation, CV)是一种常用的技术,通过将数据集划分为多个子集并进行多次训练和测试来估计模型的性能。此外࿰…...
awd基础学习
一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 (否则会宕机…...
C#基于SkiaSharp实现印章管理(10)
向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。 最初的想法是使用PDF浏览控件在线打开PDF文件,然后在控件中实现鼠标移动时动态显示印章,点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目,选…...
通过栈实现字符串中查找是否有指定字符串的存在
题目示例: 分析 由与没有给出字符串的长度,所以只能通过getline一次性处理,而在输入后恰好能倒序处理字符串,以标点符号为分界点,将数字当成字符放到栈里,遇到下一个标点符号时执行查找操作,…...
MongoDB伪分布式部署(mac M2)
1. 序言 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集? …...
Golang | Leetcode Golang题解之第454题四数相加II
题目: 题解: func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...
[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷
在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…...
Linux 系统 nvm 管理node无法使用
文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后,只要使用npm或者node,均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...
信号处理快速傅里叶变换(FFT)的学习
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来&am…...
vue3项目el-table表格行内编辑加输入框校验
核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串:scope.index.列名(注意有个点) 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...
【Node.js】内置模块FileSystem的保姆级入门讲解
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Vscode 本文代码都经由博主PleaSure乐事实操后得出,可以放心使用。 1.FileSystem介绍 Node.js 的 fs(filesystem)模块是一个核心模块,…...
问:LINUXWINDOWS线程CPU时间如何排序?
Linux 在Linux上,你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式,-e选项表示显示所有进程,--sort选项用于排序。 ps -e -o pid,tid,comm,…...
postgresql-重复执行相同语句,试试 prepare!
文章目录 每次你向 PostgreSQL 发送 SQL 语句时,数据库都必须对其进行解析(parse)。解析虽然很快,但如果同样的语句被解析一千次,这种操作累积起来可能会占用大量时间,而这些时间本可以用于处理其他事务。为避免这种情况ÿ…...
wpf加载带材料的3D模型(下载的3D预览一样有纹理)
背景:最近真的是忙啊,累出汁水了 整体效果: 放大可以看清砖头: 1、需要自己准备好3D模型,比如我这里是下载的这里的3D Warehouse,下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...
【k8s之深入理解调度】调度框架扩展点理解
参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例(2024) 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理:sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...
音视频基础理论
1. 音频基础 1.1 音频基本概念 1.1 频率:声波的频率,即声音的音调,人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅:即声波的响度,通俗的讲就是声音的高低,一般男生的声音振幅(响度)大于女生。 1.3 波形…...
《江苏科技大学学报(自然科学版)》
《江苏科技大学学报(自然科学版)》(双月刊,国内外公开发行)是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊,1986年创刊,国际刊号:ISSN1673-4807,国内刊号&…...
C++初学者指南-5.标准库(第二部分)–随机数生成
C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值(“抛硬币”)正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...
Unity2017在安卓下获取GPS位置时闪退的解决办法
在Unity使用低功耗蓝牙通信(BLE)需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法:调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin,在插件中提供获取GPS位…...
OpenGL ES 索引缓冲区(4)
OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。…...
01:(寄存器开发)点亮一个LED灯
寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板,教程来源B站up“嵌入式那些事”。…...
.Net 6.0 Windows平台如何判断当前电脑是否联网
最近在工作中开发需要判断当前电脑是否联网的需求,在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍: 1.方法一(调用winAPI) [DllImport("wininet")] public static extern bool InternetGetConnec…...
微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用
Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序,并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...
MacOS 终端执行安装 Brew
在配置新的 Mac 环境时,如果你发现终端中无法识别 brew 命令,可以按照以下步骤进行解决。 步骤 1:确保网络稳定 为了避免安装过程中出现中断,建议使用 Wi-Fi 或有线连接,不推荐使用移动网络。 步骤 2:打…...
【设计模式-解释模式】
定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...
做网站的原型文件下载/百度seo效果怎么样
-;第一次写个人博客有些小忐忑,闲话少说,直接开撸。前两天帮一朋友写一微信场景开发,头疼的是来回更改5遍,作为一个设计公司,他们对字体行间距的要求细如发丝。关于rem的使用不多说,大家都知道是…...
flash网站后台/品牌宣传策划方案
题目: 我是超链接 题解: 什么东西可以被FFT加速呢? ci∑ij0ajbi−jci∑j0iajbi−jc0a0b0c0a0b0c1a1b0a0b1c1a1b0a0b1…题目让求什么呢? ck∑n−1ikakbi−kck∑ikn−1akbi−k不会做啊,把a数组倒过来试试࿱…...
网站界面(UI)设计/关键词可以分为哪三类
在推荐之前,还是要先理清,为什么我们要用可视化工具?俗话说,有图有真相,一图胜千言,人都是视觉动物,取悦了眼球,剩下的都好说。实际上,在观察图形的时候,我们…...
wordpress 防止爆破插件/大数据统计网站
虽然程序员有女朋友的不多(误),但是开销往往都不小。VPS、域名、Mac上那一堆的收费软件、还有Apple每年更新的那些设备,经常都是肾不够用的节奏。 幸好作为程序员,我们有更多挣钱的姿势。 有同学该嚷了:…...
wordpress跟JAVA哪个简单/网页搜索引擎大全
hive 安装过程:1.修改主机名 hostnamectl set-hostname master2,做IP和主机名的映射vim /etc/hosts192.168.31.27 master3,关闭防火墙systemctl stop firewalld.service3,时间设置 查看当前时间 输入:date 查看服务器时间是否一致…...
陕西省建设工程质量安全监督总站网站/安卓神级系统优化工具
鱼羊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI天津大学这次出手,堪称雷厉风行。昨天,11月19日晚,天津大学化工学院官网发表了一则情况说明,对化工学院教授张裕卿被实名举报一事,做出了回应:已解除聘用…...