做婚礼效果图的网站有哪些/东莞seo排名外包
在 Spring 框架中,依赖注入(Dependency Injection, DI)和注解驱动(Annotation-Driven)是其核心机制,它们为 Spring 应用提供了灵活性和可扩展性。依赖注入简化了对象间的依赖管理,而注解驱动则通过简洁的注解配置取代了繁琐的 XML 配置。本文将详细分析这两个机制,并通过示例加深理解。
1. 依赖注入 (DI) 的概念
依赖注入是 Spring 的核心功能之一,它基于 控制反转(Inversion of Control, IoC)原理。依赖注入的目标是解耦对象之间的依赖关系,避免对象直接创建其他对象的实例,而是将依赖的对象通过外部传递给它。这种方式能够提高系统的模块化和可测试性。
在传统开发中,一个类的依赖对象通常是在类内部通过 new
关键字创建的,例如:
public class OrderService {private InventoryService inventoryService = new InventoryService();
}
上述代码中,OrderService
依赖 InventoryService
,它通过 new
来创建 InventoryService
的实例,这种方式导致了强耦合。
1.1 依赖注入的方式
在 Spring 中,依赖注入可以通过以下三种方式实现:
1.1.1 构造函数注入
Spring 通过类的构造函数来注入依赖。在构造函数中指定依赖,Spring 容器会自动创建依赖的实例并注入。
@Component
public class OrderService {private final InventoryService inventoryService;@Autowiredpublic OrderService(InventoryService inventoryService) {this.inventoryService = inventoryService;}
}
通过 @Autowired
注解,Spring 会自动通过构造函数将 InventoryService
注入到 OrderService
。
1.1.2 Setter 方法注入
Setter 方法注入通过 setter 方法设置依赖的实例。
@Component
public class OrderService {private InventoryService inventoryService;@Autowiredpublic void setInventoryService(InventoryService inventoryService) {this.inventoryService = inventoryService;}
}
Setter 注入允许在对象实例化后,动态地注入依赖对象。
1.1.3 字段注入
字段注入直接在类的成员变量上使用 @Autowired
注解。Spring 会在对象实例化时自动注入相应的依赖。
@Component
public class OrderService {@Autowiredprivate InventoryService inventoryService;
}
虽然字段注入代码简洁,但从设计模式的角度来看,字段注入的可测试性和可维护性较差,通常不推荐。
1.2 Spring 容器与 Bean 的生命周期
依赖注入是通过 Spring 容器来管理的。Spring 容器根据配置文件或注解驱动,自动创建和管理对象的生命周期,并负责注入它们的依赖。容器中的对象被称为 Bean,这些 Bean 是容器管理的依赖实例。
1.2.1 Bean 的定义与初始化
Spring 中的 Bean 通常由 @Component
、@Service
、@Controller
或 @Repository
注解标记,Spring 容器会自动扫描这些 Bean 并进行管理。
@Component
public class InventoryService {// 业务逻辑
}
在 Spring 启动时,容器会扫描并实例化标记为 @Component
的类。Spring 容器创建的每个 Bean 都有严格的生命周期,包括初始化、依赖注入和销毁等步骤。
1.3 依赖注入的优势
- 解耦合:依赖注入消除了对象之间的紧密依赖关系,使得代码更加灵活和模块化。
- 易于测试:使用依赖注入,可以轻松地替换依赖对象的实现,方便进行单元测试和模拟。
- 可维护性高:通过外部注入依赖,对象不需要知道其依赖项的创建过程,增强了代码的可维护性。
2. 注解驱动 (Annotation-Driven)
Spring 的 注解驱动 提供了一种简洁的方式,通过使用注解来配置和管理依赖关系、Bean 生命周期和事务控制等,而不再依赖传统的 XML 配置文件。Spring 的注解驱动机制极大地减少了繁琐的 XML 配置,提高了开发效率。
2.1 常用的 Spring 注解
2.1.1 @Component
@Component
是一个通用的注解,表示该类是 Spring 管理的组件。Spring 容器会自动扫描并注册带有 @Component
注解的类。
@Component
public class OrderService {// 业务逻辑
}
2.1.2 @Service、@Repository、@Controller
这三个注解分别用于标记 服务类、数据访问类 和 控制器类,它们是 @Component
的特化形式,具有相同的功能,但它们通过语义化注解更加明确地表示了类的职责。
@Service
public class OrderService {// 服务层逻辑
}@Repository
public class OrderRepository {// 数据访问层逻辑
}@Controller
public class OrderController {// 控制层逻辑
}
2.1.3 @Autowired
@Autowired
是 Spring 用于自动注入依赖的注解。它可以应用于构造函数、Setter 方法和字段上,Spring 会根据上下文自动注入适当的依赖。
@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;public void processOrder() {// 使用 orderRepository 完成订单处理}
}
2.1.4 @Configuration 和 @Bean
@Configuration
表示该类是一个配置类,通常用于定义多个 Bean。@Bean
用于显式地声明一个 Bean 并返回其实例。
@Configuration
public class AppConfig {@Beanpublic OrderService orderService() {return new OrderService();}
}
2.1.5 @Qualifier
当同一个接口有多个实现时,可以使用 @Qualifier
来指定注入的具体 Bean。
@Autowired
@Qualifier("specificService")
private OrderService orderService;
2.2 注解驱动的工作原理
Spring 容器通过 注解扫描 的方式自动注册和管理 Bean。Spring 提供了 @ComponentScan
注解,用于指定扫描包路径。
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {// 配置类
}
@ComponentScan
会扫描指定包路径下的类,找到所有被 @Component
、@Service
、@Repository
和 @Controller
标记的类,并将它们注册为 Spring 容器中的 Bean。
3. 依赖注入与注解驱动的结合应用
Spring 的依赖注入和注解驱动通常结合使用,形成了一种简洁高效的开发模式。在电商交易系统中,这种模式尤为常见。例如,订单处理服务中依赖了库存管理服务,通过注解实现依赖注入,极大减少了配置代码。
示例:电商交易系统中的依赖注入与注解驱动
@Service
public class OrderService {private final InventoryService inventoryService;private final PaymentService paymentService;// 构造函数注入依赖@Autowiredpublic OrderService(InventoryService inventoryService, PaymentService paymentService) {this.inventoryService = inventoryService;this.paymentService = paymentService;}public void processOrder(Order order) {// 检查库存inventoryService.checkInventory(order);// 处理支付paymentService.processPayment(order);// 生成订单System.out.println("Order processed successfully");}
}@Service
public class InventoryService {public void checkInventory(Order order) {// 检查库存逻辑}
}@Service
public class PaymentService {public void processPayment(Order order) {// 支付处理逻辑}
}@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {// Spring 配置类
}
在这个示例中,OrderService
依赖 InventoryService
和 PaymentService
,它们的注入通过 @Autowired
实现。Spring 容器会根据 @ComponentScan
注解扫描并注册这些 Bean,自动管理它们的生命周期。
相关文章:

Spring依赖注入和注解驱动详解和案例示范
在 Spring 框架中,依赖注入(Dependency Injection, DI)和注解驱动(Annotation-Driven)是其核心机制,它们为 Spring 应用提供了灵活性和可扩展性。依赖注入简化了对象间的依赖管理,而注解驱动则通…...

网络通信——OSPF协议(基础篇)
这里基础是因为没有讲解OSPF中的具体算法过程,以及其中很多小细节。后续会更新。 目录 一.OSPF的基础信息 二.认识OSPF中的Router ID 三.OSPF中的三张表 四.OSPF中的度量方法(计算开销值) 五. OSPF选举DR和BDR(就是这个区域…...

Kubernetes从零到精通(15-安全)
目录 一、Kubernetes API访问控制 1.传输安全(Transport Security) 2.认证(Authentication) 2.1 认证方式 2.2 ServiceAccount和普通用户的区别 2.3 ServiceAccount管理方式 自动ServiceAccount示例 手动ServiceAccount示例 3.鉴权 (Authorization) 3.1鉴权方式 3.2 …...

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版
推荐:《算法竞赛》,算法竞赛大全书,网购:京东 天猫 当当 文章目录 《蓝桥杯算法入门》内容简介本书读者对象作者简介联系与交流《蓝桥杯算法入门 C/C》版目录 《蓝桥杯算法入门 Java》版目录 《蓝桥杯算法入门 Python》版目录 …...

Soar项目中添加一条新的SQL审核规则示例
soar是一个开源的SQL规则审核工具,是一个go语言项目,可以直接编译构建成一个可执行程序,而且是一个命令行工具,我们可以利用archey来调用soar进行sql规则审核以及sql的分析,包括执行计划的查看及sql建议等。 soar中已…...

RISC-V开发 linux下GCC编译自定义指令流程笔记
第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言 第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入 第三步:RISC-V开发环境的搭建 C语言插入汇编 GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了…...

java代码是如何与数据库通信的?
Java代码与数据库通信的过程主要通过Java Database Connectivity(JDBC)来实现。JDBC是Java与数据库之间的标准接口,提供了用于执行SQL语句和处理数据库结果的API。以下是Java代码与数据库通信的详细步骤: 一、导入JDBC库 在Java…...

gateway--网关
在微服务架构中,Gateway(网关)是一个至关重要的组件,它扮演着多种关键角色,包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口: Gateway作为微服务的统一入口,…...

北京数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
随着北京数字孪生工业互联网可视化技术的深入应用,新型工业化智能制造工厂正逐步迈向智能化、高效化的全新阶段。这项技术不仅实现了物理工厂与数字世界的精准映射,更通过大数据分析、人工智能算法等先进手段,为生产流程优化、资源配置合理化…...

土地规划与区域经济发展:筑基均衡未来的战略经纬
在新时代背景下,土地规划不仅是空间布局的艺术,更是推动区域经济均衡发展的关键引擎。土地资源的合理配置对于激发区域潜能、促进经济结构优化有着重要意义。本文将深入剖析土地规划如何成为促进区域经济均衡发展的强大动力。 一、土地规划与区域经济的…...

wsl(2) -- ubuntu24.04配置
1. 常用脚本及别名配置 修改的文件内容参考另一篇文章常用bash脚本。 修改~/.bashrc,在文件末尾追加以下内容。 # Add by user export MYTOOLS$HOME/tools export MYBINS$HOME/bin # 系统中其他地方已经添加过了,暂不清楚是哪里添加的 #export PATH$M…...

python快速搭建https服务器
本文介绍了在ubuntu操作系统上搭建https服务器的过程 在一台连接到网络的主机上搭建https服务器,假设该主机的ip地址为:10.98.69.174 创建证书example.crt和私钥example.key openssl req -newkey rsa:2048 -nodes -keyout example.key -x509 -days 365…...

网络原理3-应用层(HTTP/HTTPS)
目录 DNSHTTP/HTTPSHTTP协议报文HTTP的方法请求报头、响应报头(header)状态码构造HTTP请求HTTPS 应用层是我们日常开发中最常用的一层,因为其他层:传输层、网络层、数据链路层、物理层这些都是操作系统和硬件、驱动已经实现好的,我们只能使用…...

JVM(HotSpot):堆空间(Heap)以及常用相关工具介绍
文章目录 一、内存结构图二、堆的定义三、堆内存溢出四、堆内存排查工具 一、内存结构图 二、堆的定义 1、通过new关键字创建的对象,都会放到堆空间中。 2、它是线程共享的,堆中的对象都要考虑线程安全问题。 那有同学肯定会问,方法内通过n…...

【Python语言初识(六)】
一、网络编程入门 1.1、TCP/IP模型 实现网络通信的基础是网络通信协议,这些协议通常是由互联网工程任务组 (IETF)制定的。所谓“协议”就是通信计算机双方必须共同遵从的一组约定,例如怎样建立连接、怎样互相识别等,…...

使用root账号ssh登录虚拟机ubuntu
在C:\Users\Administrator\.ssh目录下的config中,添加ubuntu会在根目录中,建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中,把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹,就可以不需要在ubu…...

五子棋双人对战项目(1)——WebSocket介绍
目录 一、项目介绍 如何实现实时同步对局? 二、WebSocket 1、什么是WebSocket? 2、WebSocket的报文格式 opcode payload len payload data 3、WebSocket握手过程 4、WebSocket代码的简单编写 三、WebSocket 和 HTTP的关系 1、相同点…...

rabbitMq------信道管理模块
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言信道管理的字段申明/删除交换机申明/删除队列绑定/解绑消息的发布消息确认订阅队列取消订阅信道内存管理类打开信道关闭信道/获取指定信道 总结 前言 信道是在…...

如何只用 CSS 制作网格?
来源:how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时,对其中的网格比较好奇,作者提供了 stackoverflow 的链接,就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…...

Linux安装RabbitMQ安装
1. RabbitMQ介绍 1.1 RabbitMQ关键特性 异步消息传递:允许应用程序在不直接进行网络调用的情况下交换消息。 可靠性:支持消息持久化,确保消息不会在系统故障时丢失。 灵活的路由:支持多种路由选项,包括直接、主题、…...

SpringBoot驱动的社区医院信息管理平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理社区医院信息平台的相关信息成为必然。开发…...

MyBatis-Plus如何分页查询?
MyBatis-Plus提供了一种简单而强大的分页查询功能,可以通过使用Page对象和Mapper接口中的方法来实现。以下是分页查询的基本步骤: 添加分页插件依赖 确保你的项目中已经添加了MyBatis-Plus的分页插件依赖。 <dependency><groupId>com.bao…...

云原生之容器编排实践-OpenEuler23.09离线安装Kubernetes与KubeSphere
背景 有互联网的日子确实美好,不过有时候,仅仅是有时候,你可能会面临离线部署 Kubernetes 与 KubeSphere 集群的要求。。 我们借助由青云开源的容器平台, KubeSphere 来进行可视化的服务部署。 KubeSphere 是在 Kubernetes 之上…...

构建企业数字化转型的战略基石——TOGAF框架的深度解析
数字化时代的企业变革需求 在全球范围内,数字化转型已成为企业提高竞争力、优化运营流程、提升客户体验的核心战略。数字技术的迅猛发展,不仅改变了传统行业的运作模式,也迫使企业重新思考其业务架构和技术基础设施。TOGAF(The O…...

docker -私有镜像仓库 - harbor安装
文章目录 1、镜像仓库简介2、Harbor简介3、下载与安装3.1、下载3.2、安装3.2.1、上传harbor-offline-installer-v2.8.2.tgz到虚拟机中解压并修改配置文件3.2.2、解压tgz包3.2.3、切换到解压缩后的目录下3.2.4、准备配置文件3.2.5、修改配置文件 4、启动Harbor5、启动关闭命令6、…...

头号积木玩家——软件工程专业职业生涯规划报告
说明:本报告为博主在浙江科技学院(现浙江科技大学)就读软件工程本科专业时,在必修课程《计算机导论》中撰写的报告。(报告主体2021年11月定稿,有删改) 标题说明:在电影《头号玩家》…...

Redis(初步认识和安装)
初识Redis 认识NoSQLSQL结构化:structure关联的:RelationalSQL查询ACID NoSQL非结构化无关联的非SQLBASE 认识Redis安装Redis 认识NoSQL SQL和NoSQL比较 SQL 结构化:structure 数据库中表的字段都有固定的结构 关联的:Relati…...

计算机网络:计算机网络概述:网络、互联网与因特网的区别
文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…...

网络编程套接字TCP
前集回顾 上一篇博客中我们写了一个UDP的echo server,是一个回显服务器:请求是啥,响应就是啥 一个正常的服务器,要做三个事情: 读取请求并解析根据请求,计算响应把响应写回到客户端 DatagramPacket res…...

Git
Git-2.34.1-64-bitGit-2.34.1-64-bitTortoiseGit-2.4.0.2-64bitTortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN 下载Git-2.34.1-64-bit、TortoiseGit-2.4.0.2-64bit、TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN,依次安装。 # 配置本地Git的用户名与邮箱 git c…...