尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Spring 中的依赖注入与数据源对象管理详解(基于黑马ssm网课课程总结)
📅 发布时间:2026/6/18 23:05:34

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

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

本文将系统讲解:

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

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

依赖注入(Dependency Injection)是指:

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

传统方式:

UserDaouserDao=newUserDao();

Spring 方式:

UserService←Spring注入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 的核心价值:

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

相关新闻

  • Miniconda-Python3.9环境下实现PyTorch模型A/B测试架构
  • Miniconda-Python3.9环境下实现PyTorch模型蓝绿部署流程
  • PyTorch模型回滚机制设计:基于Miniconda-Python3.9环境备份

最新新闻

  • 2026 上海靠谱的卫生间防水补漏公司推荐 top5 推荐 - 防水资讯
  • 北大青鸟哪家好?2026年北京十大校区全方位对比指南 - 北大青鸟总部
  • 企业AI落地难?破解GenAI三大断层与四步实操法
  • 专业级游戏速通计时器LiveSplit:从高效配置到高级定制的完整实战指南
  • 【审计专栏】【管理科学】【社会科学】第九十九篇 社会制衡和约束体系 · 信用评估体系专论01 信用主体 ←→ 评估者 ←→ 数据基础设施 ←→ 惩戒/激励执行者 ←→ 司法救济/修复
  • 手机图片格式怎么转换?秒转工具箱小小程序就可以直接转 - 效率工具研究所

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号