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

Spring 中的依赖注入与数据源对象管理详解(基于黑马ssm网课课程总结)

Spring 中的依赖注入与数据源对象管理详解

在 Spring 框架中,IoC(控制反转)DI(依赖注入)是最核心的思想。
Spring 通过依赖注入,将对象的创建与依赖关系统一交给容器管理,从而实现低耦合、高扩展、易维护的应用架构。上一节课的内容:Spring IoC 与 DI 核心原理学习笔记

本文将系统讲解:

  • Setter 注入
  • 构造器注入
  • 自动装配
  • 集合注入
  • 数据源对象管理

一、什么是依赖注入(DI)

依赖注入(Dependency Injection)是指:

由 Spring 容器在运行时将对象所依赖的其他对象注入进来,而不是由对象自己创建依赖。

传统方式:

UserDaouserDao=newUserDao();

Spring 方式:

UserServiceSpring注入UserDao

二、Setter 注入(属性注入)

Setter 注入是最常见的一种注入方式,通过setter 方法完成依赖注入。

1. Java 类

publicclassUserService{privateUserDaouserDao;publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}

2. XML 配置

<beanid="userDao"class="com.example.dao.UserDao"/><beanid="userService"class="com.example.service.UserService"><propertyname="userDao"ref="userDao"/></bean>

3. 特点分析

✅ 优点:

  • 结构清晰,易理解
  • 依赖可灵活修改

❌ 缺点:

  • 对象可能在“依赖未注入完全”的状态下被使用
  • 不适合强依赖关系

三、构造器注入

构造器注入通过构造方法在对象创建时一次性注入依赖。

1. Java 类

publicclassUserService{privateUserDaouserDao;publicUserService(UserDaouserDao){this.userDao=userDao;}}

2. XML 配置方式

(1)按参数顺序
<constructor-argref="userDao"/>
(2)按参数名称
<constructor-argname="userDao"ref="userDao"/>
(3)按参数类型
<constructor-argtype="com.example.dao.UserDao"ref="userDao"/>

3. 特点分析

✅ 优点:

  • 对象创建即处于完整状态
  • 适合强依赖
  • 利于构建不可变对象

❌ 缺点:

  • 构造参数过多时代码可读性降低

四、依赖注入方式的选择

场景推荐方式
强依赖构造器注入
可选依赖Setter 注入
依赖较多但必须构造器注入
简单业务Setter 注入

👉Spring 官方更推荐使用构造器注入


五、依赖自动装配(Autowire)

Spring 支持自动装配来减少 XML 配置。

<beanid="userService"class="com.example.service.UserService"autowire="byType"/>

常见装配方式

类型说明
byName按属性名
byType按类型(常用)
constructor构造器
no不自动装配(默认)

注意事项

⚠️ 使用byType时:

  • 同一类型只能有一个 Bean
  • 否则会抛出异常

⚠️ 自动装配可控性较弱,大型项目中需谨慎使用。


六、集合注入

Spring 支持向集合类型注入数据。


1. 数组注入

privateString[]hobbies;
<propertyname="hobbies"><array><value>篮球</value><value>足球</value></array></property>

2. List 注入

privateList<String>books;
<propertyname="books"><list><value>Java</value><value>Spring</value></list></property>

3. Set 注入

privateSet<String>roles;
<propertyname="roles"><set><value>admin</value><value>user</value></set></property>

4. Map 注入

privateMap<String,String>settings;
<propertyname="settings"><map><entrykey="url"value="localhost"/><entrykey="port"value="8080"/></map></property>

5. Properties 注入

privatePropertiesinfo;
<propertyname="info"><props><propkey="username">root</prop><propkey="password">123456</prop></props></property>

七、数据源对象管理(DataSource)

在企业级应用中,数据库连接管理是核心问题之一。


1. 什么是 DataSource

DataSource 是 JDBC 规范中的接口,用于获取数据库连接:

Connectionconn=dataSource.getConnection();

相比DriverManager

  • 支持连接池
  • 性能更高
  • 易于统一管理
  • 可与 Spring 事务整合

2. Spring 中的数据源管理思想

将 DataSource 作为普通 Bean 交由 Spring IoC 容器管理

  • Spring 负责创建、初始化和销毁
  • DAO 通过依赖注入使用

3. 常见数据源实现

实现说明
DriverManagerDataSource不使用连接池(测试)
DBCP / DBCP2Apache 提供
C3P0老牌连接池
HikariCPSpring Boot 默认

4. XML 配置数据源

(1)非连接池方式(了解)
<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/test"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></bean>

⚠️ 不推荐用于生产环境。


(2)连接池方式(推荐)
<beanid="dataSource"class="org.apache.commons.dbcp2.BasicDataSource"destroy-method="close"><propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/test"/><propertyname="username"value="root"/><propertyname="password"value="123456"/><propertyname="initialSize"value="5"/><propertyname="maxTotal"value="20"/></bean>

5. 数据源注入 DAO

publicclassUserDao{privateDataSourcedataSource;publicvoidsetDataSource(DataSourcedataSource){this.dataSource=dataSource;}}
<beanid="userDao"class="com.example.dao.UserDao"><propertyname="dataSource"ref="dataSource"/></bean>

6. JdbcTemplate(补充)

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean>

优点:

  • 自动管理连接
  • 简化 JDBC 操作
  • 支持事务

八、解决硬编码:加载 properties 配置文件

在前面的数据源配置中,我们直接在 XML 中写了数据库的 URL、用户名和密码,例如:

<propertyname="url"value="jdbc:mysql://localhost:3306/test"/><propertyname="username"value="root"/><propertyname="password"value="123456"/>

这种方式存在明显问题:

硬编码严重
❌ 配置分散,不利于维护
❌ 修改数据库配置需要改 XML,甚至重新编译

为了解决这些问题,Spring 提供了properties 文件加载机制


1. 什么是 properties 文件

properties文件是一种键值对形式的配置文件,常用于存放:

  • 数据库连接信息
  • Redis 配置
  • 第三方服务地址
  • 环境相关参数

示例:db.properties

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=123456

2. Spring 加载 properties 文件的方式

Spring 提供了专门的 Bean:

PropertyPlaceholderConfigurer(传统方式)


1️⃣ 在 XML 中加载 properties 文件

<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="location"value="classpath:db.properties"/></bean>

📌 说明:

  • classpath:表示从类路径下加载
  • Spring 容器启动时自动读取该配置文件

3. 使用占位符替换硬编码

加载 properties 后,就可以使用${}占位符进行引用。

数据源配置优化前

<propertyname="username"value="root"/>

数据源配置优化后

<propertyname="driverClassName"value="${jdbc.driver}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/>

📌 Spring 会在启动时自动将${}替换为 properties 中对应的值。


4. 完整示例:数据源 + properties

(1)db.properties

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=123456

(2)Spring XML 配置

<!-- 加载 properties 文件 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="location"value="classpath:db.properties"/></bean><!-- 数据源 --><beanid="dataSource"class="org.apache.commons.dbcp2.BasicDataSource"destroy-method="close"><propertyname="driverClassName"value="${jdbc.driver}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean>

5. 优势总结

✅ 消除硬编码
✅ 配置集中管理
✅ 修改配置无需改代码
✅ 为多环境部署(dev / test / prod)打基础


6. 面试高频问题总结

为什么要使用 properties 文件?

✔ 解耦配置与代码
✔ 提高可维护性和可移植性


${}是什么时候解析的?

✔ Spring 容器启动阶段,由PropertyPlaceholderConfigurer解析

7.注意点:

十、总结

通过 Spring IoC 容器,我们可以统一管理:

  • 业务对象(Service、Dao)
  • 对象之间的依赖关系
  • 集合数据
  • 基础设施对象(DataSource)

🎯Spring 的核心价值

解耦对象创建与使用,让开发者只关注业务逻辑。

http://www.rkmt.cn/news/181854.html

相关文章:

  • Miniconda-Python3.9环境下实现PyTorch模型A/B测试架构
  • Miniconda-Python3.9环境下实现PyTorch模型蓝绿部署流程
  • PyTorch模型回滚机制设计:基于Miniconda-Python3.9环境备份
  • Miniconda-Python3.9环境下实现PyTorch模型灰度发布流程
  • Miniconda-Python3.9环境下实现PyTorch模型混沌工程实验
  • 远程服务器上使用SSH连接Miniconda-Python3.9开发PyTorch应用
  • 从LangGraph到PydanticAI:AI Agent开发框架全方位解析与选择指南!
  • Miniconda-Python3.9镜像显著提升AI开发效率的5大理由
  • 硬核对决:TruthfulRAG如何运用知识图谱化解RAG知识冲突?
  • 基于MC9S12XEP100的整车控制器(VCU)设计
  • 算法题 爱吃香蕉的珂珂
  • 利用Miniconda创建独立Python环境运行PyTorch项目
  • TensorFlow Hub 模型库:超越预训练的模块化智能引擎
  • TeeChart .NET 2025.11.30
  • remi镜像
  • 2026昌平继承律所口碑排名 专业继承律师推荐 在线法律问题咨询 全流程解决方案权威解析 胜诉率优先 - 苏木2025
  • 别再在 BAPI 后直接 COMMIT WORK:把 BAPI_TRANSACTION_COMMIT、COMMIT WORK 与 BAPI buffer 一次讲透
  • Miniconda-Python3.9如何支持PyTorch与TensorRT集成
  • Miniconda-Python3.9如何支持PyTorch XLA进行TPU训练模拟
  • 保健品软文哪家公司效果好?2025年终7家服务商权威评测及最终推荐! - 十大品牌推荐
  • 把 ST22 里的短 Dump 关进笼子:ABAP 程序避免崩溃的体系化手法(含 GUI_UPLOAD、Gateway、RAP 与 Tail Recursion 案例)
  • 301与302重定向终极指南:SEO场景下的正确选择与实践技巧
  • PyTorch模型服务化部署前的Miniconda-Python3.9环境校验
  • 避免依赖冲突:用Miniconda-Python3.9构建纯净PyTorch环境
  • 2026北京昌平区公司纠纷律师事务所推荐指南:权威测评凸显专业优势,胜诉率领先机构盘点,法律问题咨询找靠谱律所不踩坑 - 苏木2025
  • 阿赛姆ESD二极管在笔记本电脑HDMI2.1接口的应用
  • GitHub热门项目复现利器:Miniconda-Python3.9+PyTorch环境搭建
  • Miniconda-Python3.9中配置PyTorch Profiler进行性能分析
  • PyTorch安装Mobile Interpreter:Miniconda-Python3.9支持移动端部署
  • iOS开发中CPU功耗监控的实现与工具使用