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

spring学习(使用spring加载properties文件信息)(spring自定义标签引入)

目录

一、博客引言。

二、基本配置准备。

(1)初步分析。

(2)初始spring配置文件。

三、spring自定义标签的引入。

(1)基本了解。

(2)引入新的命名空间:xmlns:context。

(3)使用context空间加载properties文件。

1、resources目录下新建properties文件。

2、使用标签。

3、使用属性占位符${}读取properties文件里对应属性值。

四、加载properties文件的测试。

(1)dao层。

(2)spring配置文件中配置BookDaoImpl实现类的bean。

(3)测试类。

(4)properties文件中的键名注意与系统变量区分。

system-properties-mode。

(5)加载多个properties文件。

1、测试2个properties文件的读取。

2、使用*.properties加载所有properties文件。

3、使用classpath:*.properties加载当前工程所有properties文件。(规范)

4、使用classpath*:*.properties加载所有properties文件。(包括外部jar包)

五、spring配置文件中加载properties文件几种写法的小结。


一、博客引言。

  • 之前的学习——管理第三方资源的两种数据源对象。其中那些配置的属性值一起写在spring配置文件中是不太合适的。(不方便统一管理)

  • 在本篇博客的学习就是把这些配置的属性值单独抽出来存放到properties文件中。然后再利用spring去加载对应的properties文件的信息。

二、基本配置准备。

(1)初步分析。
  • 本篇博客的案例是基于上篇博客进行。其中主要的核心就是管理阿里云-druid的数据源对象。spring学习(druid、c3p0的数据源对象管理)(案例学习)-CSDN博客

  • 上次的学习就是直接在配置文件中将数据库驱动、url、用户名与密码的属性值全部"写死"在spring配置文件中。


(2)初始spring配置文件。
  • 其中主要的<bean>是对druid的数据源对象的基本配置。
  • 就目前而言,属性的值还是写在spring配置文件中,待会就进行修改。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--管理DruidDataSource对象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test111"></property><property name="username" value="root"></property><property name="password" value="root123"></property></bean></beans>

三、spring自定义标签的引入。

(1)基本了解。
  • spring默认提供了一些标准的XML标签,如<bean>、<beans>、<import>等,用于常见的配置需求。
  • 然而,随着项目复杂度的增加,这些标准标签可能无法满足一些特定的配置需求。通过自定义标签,开发者可以封装复杂的配置逻辑,使XML配置文件更加简洁、易读和易于维护。

  • 简单理解就是除了spring-beans提供的标签外的其他标签。那么我们就需要引入其它类似这样写法的命名空间以及相应的地址。()


(2)引入新的命名空间:xmlns:context。
  • 引入新的命名空间的写法:具体如下。("依葫芦画瓢"嘛)如果找不到可以去对应需要引入的技术的官网寻找对应的写法,然后直接复制粘贴。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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"><!--    管理DruidDataSource对象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test111"></property><property name="username" value="root"></property><property name="password" value="root123"></property></bean></beans>

(3)使用context空间加载properties文件。
1、resources目录下新建properties文件。
  • 数据库驱动、url、用户名、密码每一个都独自占一行。
  • 写法:"键名=键值"。


2、使用标签<context:property-placeholder>。
  • 当引入新的命名空间后,简单的"<"就可以显示大多数可以可以使用的标签。
  • 这就是spring自定义标签的扩展性好处。


  • 使用属性location指定properties文件的地址。


<context:property-placeholder location="jdbc.properties"/>

3、使用属性占位符${}读取properties文件里对应属性值。
  • 到这一步基本上就是完成了。下面采用另外一个案例进行测试。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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"><context:property-placeholder location="jdbc.properties"/><!--    管理DruidDataSource对象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean></beans>

四、加载properties文件的测试。

(1)dao层。
  • BookDao接口。
package com.fs.dao;public interface BookDao {/*** dao层save方法*/void save();
}
  • BookDaoImpl实现类。
package com.fs.dao.impl;import com.fs.dao.BookDao;public class BookDaoImpl implements BookDao {private String name;public void setName(String name) {this.name = name;}@Overridepublic void save() {System.out.println("book dao save...");/*** 测试properties文件中的属性值是否成功注入!*/System.out.println("name注入的值:"+name);}
}

(2)spring配置文件中配置BookDaoImpl实现类的bean。
  • 对name属性注入采用setter方式注入。
  • 其次注入的属性值采用占位符${}读取properties文件里对应属性值。(测试)
<bean id="bookDao" class="com.fs.dao.impl.BookDaoImpl"><property name="name" value="${jdbc.driverClassName}"></property>
</bean>

(3)测试类。
  • 获取Ioc容器,通过指定id获取对应bean。
  • 调用BookDaoImpl的save方法完成测试。
package com.fs.test;import com.fs.dao.impl.BookDaoImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App3 {public static void main(String[] args) {//获取Spring容器,读取配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springConfig.xml");Object obj = context.getBean("bookDao");//强制类型转换BookDaoImpl bookDao = (BookDaoImpl) obj;bookDao.save();}
}
  • 测试运行结果如下。


(4)properties文件中的键名注意与系统变量区分。
  • 如果将jdbc.username改成username。再进行测试。


  • 结果却显示86183!!!这是系统的环境变量的用户。它们之间产生了冲突问题。
  • 也就是系统的环境变量的优先级要比当前的程序里的环境要高!加载文件后直接替换了当前的属性值,而我配置的东西并没有生效!



  • 解决方法:在spring配置文件中加载properties文件时再设置一个属性。
  • system-properties-mode。


  • 将该属性值设置成"NEVER"。表示不加载系统属性。
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
  • 现在再测试,结果就是成功获取到自己配置的属性值了。


(5)加载多个properties文件。
1、测试2个properties文件的读取。
  • jdbc.properties。


  • jdbc2.properties。


  • 多个properties文件使用逗号相隔。


2、使用*.properties加载所有properties文件。
<context:property-placeholder location="*.properties" system-properties-mode="NEVER"/>

3、使用classpath:*.properties加载当前工程所有properties文件。(规范)
  • 注意这种写法只能读取当前工程的配置文件。而对于外部导入的jar包或者某个框架中有properties文件,那么这种写法是加载不到的。
<context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>

4、使用classpath*:*.properties加载所有properties文件。(包括外部jar包)
  • 这样的写法:不仅可以从当前工程读取properties文件,还可以读取它所依赖的jar包中读取properties文件。
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>

五、spring配置文件中加载properties文件几种写法的小结。

  • 最常见且常用的5种写法。

相关文章:

spring学习(使用spring加载properties文件信息)(spring自定义标签引入)

目录 一、博客引言。 二、基本配置准备。 &#xff08;1&#xff09;初步分析。 &#xff08;2&#xff09;初始spring配置文件。 三、spring自定义标签的引入。 &#xff08;1&#xff09;基本了解。 &#xff08;2&#xff09;引入新的命名空间&#xff1a;xmlns:context。 &…...

bigemap pro如何进行poi兴趣点搜索?

准备工具&#xff1a;BIGEMAP Pro是数据要素设计软件(DED),国产基础软件&#xff0c;大数据编辑、制图、多源数据要素类处理软件打开软件右上角选择分类搜索然后用矩形或者选择行政边界线选择需要查询的范围选中范围以后点击查询然后可以直接加载到地图然后图层右键数据导出矢量…...

Mybatis源码02 - 初始化基本过程(引导层部分)

初始化基本过程&#xff08;引导层部分&#xff09; 文章目录 初始化基本过程&#xff08;引导层部分&#xff09;一&#xff1a;初始化的方式及引入二&#xff1a;初始化方式-XML配置文件1&#xff1a;MyBatis初始化基本过程2&#xff1a;创建Configuration对象的过程2.1&…...

【Elasticsearch】bucket_sort

Elasticsearch 的bucket_sort聚合是一种管道聚合&#xff0c;用于对父多桶聚合&#xff08;如terms、date_histogram、histogram等&#xff09;的桶进行排序。以下是关于bucket_sort的详细说明&#xff1a; 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序&#xff…...

k8s证书过期怎么更新?

在 Kubernetes 集群中&#xff0c;证书过期可能导致集群不可用&#xff0c;尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行&#xff0c;您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤&#xff1a; 1. 检查证书状…...

活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…...

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...

C# 比较两个List集合内容是否相同

在 C# 中&#xff0c;要比较两个 List<T> 集合的内容是否相同&#xff0c;可以通过以下几种方法&#xff1a; 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法&#xff08;顺序和内容都相等&#xff09; 顺序和内容都相等&#xff1a;使用 SequenceEqual。 usin…...

vue2 多页面pdf预览

使用pdfjs-dist预览pdf&#xff0c;实现预加载&#xff0c;滚动条翻页。pdfjs的版本很重要&#xff0c;换了好多版本&#xff0c;终于有一个能用的 node 20.18.1 "pdfjs-dist": "^2.2.228", vue页面代码如下 <template><div v-loading"loa…...

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…...

Hello Robot 推出Stretch 3移动操作机器人,赋能研究与商业应用

Hello Robot公司近日发布了其新一代开源移动操作机器人Stretch 3&#xff0c;这是一款高度灵活的机器人平台&#xff0c;专为机器人研究、教育实验和商业自动化设计。Stretch 3 结合了先进的移动机器人技术、灵巧操作能力和开源软件生态系统&#xff0c;为用户提供了一个功能强…...

从零到一:我的元宵灯谜小程序诞生记

缘起&#xff1a;一碗汤圆引发的灵感 去年元宵节&#xff0c;我正捧着热腾腾的汤圆刷朋友圈&#xff0c;满屏都是"转发锦鲤求灯谜答案"的动态。看着大家对着手机手忙脚乱地切换浏览器查答案&#xff0c;我突然拍案而起&#xff1a;为什么不做一个能即时猜灯谜的微信…...

Docker 安装与配置 Nginx

摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时&#xff0c;探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外&#xff0c;文章还涵…...

Oracle常见语法

一、求交集 SELECT column1, column2 FROM table1 INTERSECT SELECT column1, column2 FROM table2;INTERSECT 操作符是 Oracle 和一些其他数据库&#xff08;如 PostgreSQL 和 SQL Server&#xff09;特有的集合操作符&#xff0c;在 MySQL 中并不直接支持。MYSQL同效果代码&a…...

在Vue3中使用Echarts的示例 两种方法

在Vue 3中使用ECharts可以通过两种主要方法实现:全局安装和组件封装。下面我将分别 介绍这两种方法的具体实现步骤。 方法1:全局安装 1.安装ECharts 在你的Vue项目中&#xff0c;首先需要安装ECharts。打开终端&#xff0c;运行以下命令: Bash copy code npm install ec…...

【docker】docker改动镜像并重新编译举例

docker改动镜像并重新编译举例 使用vllm启动Qwen VL 2.5出现报错 0.7.2 Docker Container doesnt support Qwen VL 2.5 Instruct 查看镜像 docker images 会发现本地有vllm/vllm-openai:v0.7.2镜像&#xff0c;id为f78c8f2f8ad5 空白文件夹中新建文件Dockerfile 写入&#…...

具身智能训练新思路!将生成视频用于训练机器人

将生成视频用于训练具身智能(Embodied AI)确实是近年来备受关注的前沿方向,这一思路通过结合生成式AI(如扩散模型、神经辐射场等)与机器人学习,为解决真实世界数据稀缺、训练成本高等问题提供了新可能。以下从技术逻辑、潜在优势、挑战及案例方向展开分析: 一、技术逻辑…...

15、深度学习-自学之路-反向传播程序展示、激活函数的应用,反向权重的更新、2层神经网络的应用,输入输出相关性的理解。

这个里面要学习和展示的内容会比较多&#xff0c;需要好好的认真思考 第一个要思考的就是&#xff1a;输入和输出相关性的理解&#xff0c;我们先拿一层的神经网络来说明一下&#xff0c; 输入有2个因素&#xff0c;对应有两个权重&#xff0c;输出有一个结果。 输入的两个因…...

【JavaEE进阶】依赖注入 DI详解

目录 &#x1f334;什么是依赖注入 &#x1f384;依赖注入的三种方法 &#x1f6a9;属性注⼊(Field Injection) &#x1f6a9;Setter注入 &#x1f6a9;构造方法注入 &#x1f6a9;三种注⼊的优缺点 &#x1f333;Autowired存在的问题 &#x1f332;解决Autowired存在的…...

医疗影响分割 | 使用 Swin UNETR 训练自己的数据集(3D医疗影像分割教程)

<Swin UNETR: Swin Transformers for Semantic Segmentation of Brain Tumors in MRI Images> 代码地址:unetr 论文地址:https://arxiv.org/pdf/2201.01266 一、下载代码 在Github上下载代码,然后进入SWINUNETR,前两个是针对两个数据集(BRATS21、BTCV)的操作,这里…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...