当前位置: 首页 > news >正文

深入理解Spring的IOC容器与依赖注入

深入理解Spring的IOC容器与依赖注入

引言

Spring框架的核心功能之一就是它的IOC容器,它为开发人员提供了强大的依赖管理和控制反转的能力。本文将详细介绍Spring的IOC容器以及依赖注入的基本概念和实现方式,并通过示例展示如何在实际项目中应用这些技术。

1. Spring IOC容器简介

Spring的IOC(Inversion of Control,控制反转)容器是一种管理对象及其依赖关系的工具。它负责创建对象、配置对象以及管理对象的生命周期。通过这种方式,Spring可以减少组件间的耦合度,提高代码的可维护性和可扩展性。

2. 创建Spring容器

要使用Spring的IOC容器,首先需要创建一个容器实例。Spring提供了多种创建容器的方式:

XML配置文件:

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

注解配置:

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
3. 依赖注入方式

Spring提供了多种依赖注入的方式:

构造器注入:

public class UserService {private UserRepository repository;public UserService(UserRepository repository) {this.repository = repository;}
}// 在Spring配置文件中
<bean id="userService" class="org.example.UserService"><constructor-arg ref="userRepository"/>
</bean>

Setter注入:

public class UserService {private UserRepository repository;public void setRepository(UserRepository repository) {this.repository = repository;}
}// 在Spring配置文件中
<bean id="userService" class="org.example.UserService"><property name="repository" ref="userRepository"/>
</bean>

字段注入:

@Service
public class UserService {@Autowiredprivate UserRepository repository;
}
4. Bean的作用域

Spring支持多种Bean的作用域,包括但不限于:

  • Singleton(单例): 默认情况下,每个Bean在Spring容器中只有一个实例。
  • Prototype(原型): 每次请求都会创建一个新的Bean实例。
// 配置文件中设置Prototype作用域
<bean id="user" class="org.example.User" scope="prototype"/>
5. Bean的生命周期

Spring还允许开发者定义Bean的初始化和销毁方法:

初始化方法:

public class User {public void init() {System.out.println("Initializing User bean.");}
}// 在Spring配置文件中
<bean id="user" class="org.example.User" init-method="init"/>

销毁方法:

public class User {public void destroy() {System.out.println("Destroying User bean.");}
}// 在Spring配置文件中
<bean id="user" class="org.example.User" destroy-method="destroy"/>
结论

通过使用Spring的IOC容器和依赖注入,我们可以有效地管理应用程序中的组件,降低组件间的耦合度,提高代码的可读性和可维护性。了解这些基础知识将有助于开发者更好地利用Spring框架的强大功能。

相关文章:

深入理解Spring的IOC容器与依赖注入

深入理解Spring的IOC容器与依赖注入 引言 Spring框架的核心功能之一就是它的IOC容器&#xff0c;它为开发人员提供了强大的依赖管理和控制反转的能力。本文将详细介绍Spring的IOC容器以及依赖注入的基本概念和实现方式&#xff0c;并通过示例展示如何在实际项目中应用这些技术…...

Qt读写sysfs

本文介绍Qt读写sysfs。 在嵌入式Linux系统上开发Qt应用程序&#xff0c;经常会涉及到外设的控制&#xff0c;比如GPIO&#xff0c;PWM的控制&#xff0c;Linux环境下可以像操作文件一样操作它们&#xff0c;这通常会涉及到sysfs的读写。本文以读写GPIO为例&#xff0c;简要介绍…...

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代&#xff0c;地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上&#xff0c;它不仅是地理信息的立体呈现&#xff0c;更是智慧城市的基石&#xff0c;打开了通往未来城市规划、管理…...

汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障

故障现象  一辆2010款劳斯莱斯古斯特车&#xff0c;搭载N74发动机&#xff0c;累计行驶里程约为11万km。车主反映&#xff0c;起动发动机后组合仪表和中央信息显示屏均提示传动系统故障。用故障检测仪检测&#xff0c;发现发动机控制模块2&#xff08;DME2&#xff09;中存储…...

监督学习和无监督学习是什么?

监督学习和无监督学习是机器学习中的两种基本学习方式&#xff0c;它们在处理数据和训练模型时有着显著的区别。 监督学习 定义&#xff1a; 监督学习是指利用一组已知类别的样本&#xff08;即标记的数据&#xff09;来调整分类器的参数&#xff0c;使其达到所要求性能的过程…...

YII2的errorHandler.errorAction失效原因

<?phpreturn [components => [errorHandler => [errorAction => site/error,],] ]; 这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。 代码查看:yii\web\ErrorHandler::renderException <?phpprotected function ren…...

已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。

#include<assert.h> typedef struct SLnode {int data;struct SLnode* prior;struct SLnode* next; }SLnode,*SLnodelist; //创建结点 SLnode* createhead(int data) {SLnode* newnode (SLnode*)malloc(sizeof(SLnode));newnode->data data;newnode->next newno…...

什么是Tensor???为什么人工智能领域论文中经常出现这个名词

文章目录 什么是Tensor&#xff1f;&#xff1f;数学符号表示 什么是Tensor&#xff1f;&#xff1f; Tensor&#xff0c;中文叫张量。Tensor实际上就是一个多维数组&#xff08;multidimensional array&#xff09;。 而Tensor的目的是能够创造更高维度的矩阵、向量。 数学符…...

爬虫练习_01

前言 基础爬虫小练习01 一、requests板块使用 demo_01 import requests from lxml import etreeurl "https://movie.douban.com/top250" headers {"authority": "movie.douban.com","method": "GET","path"…...

Datawhale X 魔搭 AI夏令营第四期 魔搭-AIGC方向 task02笔记

从零入门AI生图原理&实践 是 Datawhale 2024 年 AI 夏令营第四期的学习活动&#xff08;“AIGC”方向&#xff09;&#xff0c;基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习。 Datawhale官方的Task2链接&#xff1a;Task02 往期Task1链接&#xff1a;Ta…...

多模态大语言模型的免训练视觉提示学习 ControlMLLM

ControlMLLM: Training-Free Visual Prompt Learning for Multimodal Large Language Models github paper 在本研究中&#xff0c;提出了一种无需进行训练的方法&#xff0c;通过可学习的潜变量优化将视觉提示注入到多模态大型语言模型&#xff08;MLLMs&#xff09;中。 在…...

Oracle|DM 常用|不常用 SQL大口袋

目录 一、前言 二、SQL写法 1、sql获取某一条数据中的前一条和后一条 2、实现like多个值的查询&#xff08;Oracle和dm支持&#xff0c;MySQL未试过&#xff09; 3、start with connect by prior 使用方法 4、用hextoraw解决select、update、delete语句执行慢 5、ORA-00…...

嵌入式软件--模电基础 DAY 1

C语言的学习告一段落了&#xff0c;要多多注意复习回顾&#xff0c;温故而知新&#xff0c;学习的过程就是与遗忘作斗争。接下来就是嵌入式学习中硬件电路方面的知识了。 一、电学基础 1.电流 电流&#xff08;Current&#xff09;是电荷在单位时间内通过导体横截面的流动量…...

【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign

上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如…...

《投资的原理》阅读笔记二——价值投资真是王者吗?

《投资的原理》的第二章是《史记货殖列传里的八大投资金句》&#xff0c;作者在这一章里宣扬的主要观点是价值投资才是稳妥的投资之路。但我觉得作者讲述的很多例子&#xff0c;包括经典的“两个金条放在一起&#xff0c;你告诉我那根是高尚的”&#xff0c;更多的应该体现在“…...

SSH、FTP、SFTP相关协议详解

一、SSH 1、定义 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录到另一台计算机上&#xff0c;并执行命令或程序。SSH由IETF的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff0c;是建立在应用层基础上的安全…...

C语言进阶——一文带你深度了解“C语言关键字”(中篇6)

本篇文章记录我学习C语言进阶知识——C语言关键字&#xff0c;旨在记录分享&#xff0c;希望我的分享能带给你不一样的收获&#xff01; 目录 一、return关键字 二、const 关键字也许该被替换为 readolny &#xff08;一&#xff09;、 const 修饰的只读变量 &#xff08;二…...

自建极简Ethercat主站-第8章 FOE基础功能实现

文章目录 第8章 FOE8.1 FOE简介8.2 FOE 数据结构8.2.1 FOE帧格式8.2.2 FOE请求8.3 数据传输流程8.3.1 读流程8.3.2 写流程8.3.3 忙操作8.3.4 代码示例第8章 FOE 源码地址 8.1 FOE简介 ​ FOE(File Access over Ethercat),用于节点之间的文件传输。协议类似于TFTP协议,感觉…...

SQL Zoo 8.Using Null

以下数据均来自SQL Zoo 1.List the teachers who have NULL for their department.&#xff08;列出所属部门为NULL的教师&#xff09; select name from teacher where dept is null 2.Note the INNER JOIN misses the teachers with no department and the departments wit…...

LeetCode274. H 指数

题目链接&#xff1a; 274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a;这个题目可以使用哈希表来以空间换时间&#xff0c;我们设置一个数组v来统计每一个对应的影响因子的文章出现的数量&#xff0c;遍历一遍后&#xff0c;v[i]表示影响因子为i的…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...