🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、案例:数据源对象管理 1.环境准备 2.实现Druid管理 3.实现C3P0管理 二、加载properties文件
🍓系列专栏:Spring系列专栏
🍉个人主页:个人主页
目录
在这一节中,我们将通过一个案例来学习下对于第三方bean该如何进行配置管理。 以后我们会用到很多第三方的bean,本次案例将使用咱们前面提到过的数据源Druid(德鲁伊)和C3P0来配置学习下。
4.0.0 com.itheima spring_09_datasource 1.0-SNAPSHOT org.springframework spring-context 5.2.10.RELEASE com.alibaba druid 1.1.16 c3p0 c3p0 0.9.1.2 Mysql mysql-connector-java 5.1.47
public class App {public static void main(String[] args) {ApplicationContext ctx = newClassPathXmlApplicationContext("applicationContext.xml");}}
思路分析
需求 : 使用 Spring 的 ioc 容器来管理 Druid 连接池对象 1. 使用第三方的技术,需要在 pom.xml 添加依赖【前面已导入】 2. 在配置文件中将【第三方的类】制作成一个 bean ,让 IOC 容器进行管理 3. 数据库连接需要基础的四要素 驱动 、 连接 、 用户名 和 密码 ,【如何注入】到对应的 bean 中 4. 从 IOC 容器中获取对应的 bean 对象,将其打印到控制台查看结果
步骤1:配置第三方bean
在applicationContext.xml配置文件中添加DruidDataSource的配置
说明 : driverClassName: 数据库驱动 url: 数据库连接地址 username: 数据库连接用户名 passWord: 数据库连接密码 数据库连接的四要素要和自己使用的数据库信息一致。 步骤2 : 从 IOC 容器中获取对应的 bean 对象 public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); DataSource dataSource = (DataSource) ctx.getBean("dataSource"); System.out.println(dataSource); }}
做完案例后,我们可以将刚才思考的两个问题答案说下 : DruidDataSource
setter注入
注意 : 运行程序
实现思路
需求 : 将数据库连接四要素提取到 properties 配置文件, spring 来加载配置信息并使用这些信息 来完成属性注入。 1. 在 resources 下创建一个 jdbc.properties( 文件的名称可以任意 ) 5 2. 将数据库连接四要素配置到配置文件中 3. 在 Spring 的配置文件中加载 properties 文件 4. 使用加载到的值实现属性注入 其中第 3 , 4 步骤是需要大家重点关注,具体是如何实现。
实现步骤
步骤 1: 准备 properties 配置文件 resources 下创建一个 jdbc.properties 文件 , 并添加对应的属性键值对jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/spring_dbjdbc.username=rootjdbc.password=root
步骤 2: 开启 context 命名空间 在 applicationContext.xml 中开 context 命名空间 Http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
步骤 3: 加载 properties 配置文件 在配置文件中使用 context 命名空间下的标签来加载 properties 配置文件
步骤 4: 完成属性注入 使用 ${key} 来读取 properties 配置文件中的内容并完成属性注入
至此,读取外部 properties 配置文件中的内容就已经完成。 实现思路
对于上面的案例,效果不是很明显,我们可以换个案例来演示下:
需求 : 从 properties 配置文件中读取 key 为 name 的值,并将其注入到 BookDao 中并在 save 方法中进行打印。 1. 在项目中添加 BookDao 和 BookDaoImpl 类 2. 为 BookDaoImpl 添加一个 name 属性并提供 setter 方法 3. 在 jdbc.properties 中添加数据注入到 bookDao 中打印方便查询结果 4. 在 applicationContext.xml 添加配置完成配置文件加载、属性注入 (${key})
实现步骤
步骤 1: 在项目中添对应的类 BookDao 和 BookDaoImpl 类,并在 BookDaoImpl 类中添加 name 属性与 setter 方法public interface BookDao { public void save();}
public class BookDaoImpl implements BookDao { private String name; public void setName(String name) { this.name = name; } public void save() { System.out.println("book dao save ..." + name); }}
步骤 2: 完成配置文件的读取与注入 在 applicationContext.xml 添加配置, bean 的配置管理 、 读取外部 properties 、 依赖注入 :
步骤 3: 运行程序 在 App 类中,从 IOC 容器中获取 bookDao 对象,调用方法,查看值是否已经被获取到并打印控制台 public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookDao bookDao = (BookDao) ctx.getBean("bookDao"); bookDao.save(); }}
问题一:键值对的key为username引发的问题
1.在properties中配置键值对的时候,如果key设置为username
username=root666
2. 在 applicationContext.xml 注入该属性
3. 运行后,在控制台打印的却不是 root666 ,而是自己电脑的用户名 4. 出现问题的原因是 public class AppSystemProperties { public static void main(String[] args) { Map env = System.getenv(); System.out.println(env); }}
大家可以自行运行,在打印出来的结果中会有一个 USERNAME=XXX[ 自己电脑的用户名称 ] 5. 解决方案
system-properties-mode: 设置为 NEVER, 表示不加载系统属性,就可以解决上述问题。 当然还有一个解决方案就是避免使用 username 作为属性的 key 。 问题二:当有多个properties配置文件需要被加载,该如何配置? 1. 调整下配置文件的内容,在 resources 下添加 jdbc.properties , jdbc2.properties , 内容如 下 : jdbc.properties jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/spring_dbjdbc.username=rootjdbc.password=root
jdbc2.properties username=root666
2. 修改 applicationContext.xml
说明 : 前面已经完成bean与依赖注入的相关知识学习,接下来我们主要学习的是IOC容器中的核心容器。
这里所说的核心容器,大家可以把它简单的理解为ApplicationContext,前面虽然已经用到过,但
是并没有系统的学习,接下来咱们从以下几个问题入手来学习下容器的相关知识:
在学习和解决上述问题之前,先来准备下案例环境:
org.springframework spring-context 5.2.10.RELEASE
添加BookDao和BookDaoImpl类
public interface BookDao { public void save();}
public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ..." );}}
创建运行类App
public class App {public static void main(String[] args) {ApplicationContext ctx = newClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}}
最终创建好的项目结构如下:
案例中创建ApplicationContext的方式为:
ApplicationContext ctx = newClassPathXmlApplicationContext("applicationContext.xml");
这种方式翻译为:类路径下的XML配置文件
除了上面这种方式,Spring还提供了另外一种创建方式为:
ApplicationContext ctx = newFileSystemXmlApplicationContext("applicationContext.xml");
这种方式翻译为:文件系统下的XML配置文件
使用这种方式,运行,会出现如下错误:
从错误信息中能发现,这种方式是从项目路径下开始查找applicationContext.xml配置文件的,所 以需要将其修改为:对应的绝对路径
说明:大家练习的时候,写自己的具体路径。 这种方式虽能实现,但是当项目的位置发生变化后,代码也需要跟着改,耦合度较高,不推荐使用。
方式一,就是目前案例中获取的方式:
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
这种方式存在的问题是每次获取的时候都需要进行类型转换,有没有更简单的方式呢?
方式二:
BookDao bookDao = ctx.getBean("bookDao",BookDao.class);
这种方式可以解决类型强转问题,但是参数又多加了一个,相对来说没有简化多少。
方式三:
BookDao bookDao = ctx.getBean(BookDao.class);
这种方式就类似我们之前所学习依赖注入中的按类型注入。必须要确保IOC容器中该类型对应的bean对象只能有一个。
(1)在idea中双击shift ,输入BeanFactory
(2)点击进入BeanFactory类,ctrl+h,就能查看到如下结构的层次关系
从图中可以看出,容器类也是从无到有根据需要一层层叠加上来的,大家重点理解下这种设计思想。
使用BeanFactory来创建IOC容器的具体实现方式为:
public class AppForBeanFactory {public static void main(String[] args) {Resource resources = new ClassPathResource("applicationContext.xml");BeanFactory bf = new XmlBeanFactory(resources);BookDao bookDao = bf.getBean(BookDao.class);bookDao.save();}}
为了更好的看出 BeanFactory 和 ApplicationContext 之间的区别,在 BookDaoImpl 添加如下构造 函数 : public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("constructor");}public void save() {System.out.println("book dao save ..." );}}
如果不去获取 bean 对象,打印会发现:
其实整个配置中最常用的就两个属性id和class。
把 scope 、 init-method 、 destroy-method 框起来的原因是,后面注解在讲解的时候还会用到, 所以大家对这三个属性关注下。《windows Powershell自动化运维大全》由微软最有价值专家、微软TechEd优秀讲师徐鹏著作,多年经验毫无保留分享,一本书完全讲透Windows PowerShell自动化运维所有核心知识点,赠送同步视频学习教程,助你从运维初级工程师转向高级运维工程师!一本书精通Windows PowerShell自动化运维!
本书从基础的 PowerShell 命令开始,先后讲述了基础命令、模块、脚本的编写等相关知识。同时为了让大家更快地理解和掌握 PowerShell 的环境配置和编写,我们使用系统内置的 PowerShell ISE 开发环境进行 PowerShell 代码的开发和运行。为了照顾很多基础薄弱的读者,在进行代码案例演示时都使用了 15 行以内的代码。
本书可作为学校培训与企业培训的基本学习教程和工具书,相信通过本书的学习,读者可以更快地理解 PowerShell在日常生活及企业内的应用,为读者在自动化运维的道路上助力。
徐鹏,微软最有价值专家、微软TechEd优秀讲师、《PowerQuery从入门到精通》作者。先后就职于宏基企业服务部、微软中国有限公司,为多家全球500强企业提供微软全系列产品培训、顾问咨询及架构优化服务。
🍓本次送 3 本书 ,评论区抽3位小伙伴送书🍓
活动时间:截止到 2023-05-02 14:00:00
抽奖方式:利用程序进行抽奖。
参与方式:关注博主、点赞、收藏,评论区评论 "五一假期,码不停息!"
迫不及待的小伙伴也可以访问下面的链接了解详情:
🍓 获奖名单🍓
名单公布时间: 2023-05-02 14:00:00
来源地址:https://blog.csdn.net/Javascript_tsj/article/details/130160016
--结束END--
本文标题: 【Spring篇】IOC/DI配置管理第三方bean
本文链接: https://www.lsjlt.com/news/387873.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0