当前位置: 首页 > 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.jsqmd.com/news/166310/

相关文章:

  • SpringBoot代码集
  • Qt QPointer 快速入门
  • Miniconda-Python3.9环境下实现PyTorch模型安全沙箱运行
  • Miniconda-Python3.9环境下实现PyTorch模型公平性检测流程
  • 口碑好的气密性测试仪生产企业,国产气密性测试仪哪家强? - 品牌推荐大师
  • 强软弱虚引用如何理解
  • Miniconda-Python3.9环境下实现PyTorch模型A/B测试架构
  • 2025年工程塑料回收大揭秘:如何选对靠谱回收厂家?,工程塑料回收有哪些技术领航者深度解析 - 品牌推荐师
  • Miniconda-Python3.9环境下实现PyTorch模型蓝绿部署流程
  • Miniconda-Python3.9环境下运行PyTorch官方示例代码全记录
  • 2025年度苗木批发基地优质供应商排行榜新鲜出炉,油松/丝棉木/樱花/金叶女贞/青叶复叶槭/苗木/栾树/紫薇/国槐苗木批发基地批发商选哪家 - 品牌推荐师
  • PyTorch模型回滚机制设计:基于Miniconda-Python3.9环境备份
  • PyTorch可信执行环境(TEE)实验:Miniconda-Python3.9准备
  • Miniconda-Python3.9如何支持PyTorch与Airflow工作流集成
  • 2025Q4 天津南开区装修公司 TOP5 推荐 全业态装修需求精准适配 - 品牌智鉴榜
  • PyTorch官方安装命令在Miniconda-Python3.9中的实际应用
  • 【博客之星 2025】我不是在写博客,就是在写博客的路上,这是我今年第575篇
  • Miniconda-Python3.9环境下实现PyTorch模型灰度发布流程
  • Miniconda-Python3.9环境下实现PyTorch模型混沌工程实验
  • Miniconda-Python3.9环境下监控PyTorch GPU显存使用情况
  • 从LangGraph到PydanticAI:AI Agent开发框架全方位解析与选择指南!
  • 远程服务器上使用SSH连接Miniconda-Python3.9开发PyTorch应用
  • Windows10/11右键-超级菜单-MCU(动态菜单)
  • COMSOL 使用-后续测试
  • Miniconda-Python3.9镜像显著提升AI开发效率的5大理由
  • Miniconda-Python3.9如何支持PyTorch与Redis高速缓存集成
  • 硬核对决:TruthfulRAG如何运用知识图谱化解RAG知识冲突?
  • 基于MC9S12XEP100的整车控制器(VCU)设计
  • 天地为幕,人文作笔 ——一汽丰田普拉多×演员赵秦 甘孜文化纪录片行记
  • 学长亲荐8个AI论文工具,专科生毕业论文轻松搞定!