当前位置: 首页 > 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)的操作,这里…...

IGBT的两级关断

IGBT&#xff08;绝缘栅双极型晶体管&#xff09;的两级关断&#xff08;Two-stage turn-off&#xff09;是一种优化关断过程的方法&#xff0c;主要用于减少关断时的电压过冲和dv/dt&#xff08;电压变化率&#xff09;过高的问题&#xff0c;特别是在大功率应用中&#xff08…...

微服务与网关

什么是网关 背景 单体项目中&#xff0c;前端只用访问指定的一个端口8080&#xff0c;就可以得到任何想要的数据 微服务项目中&#xff0c;ip是不断变化的&#xff0c;端口是多个的 解决方案&#xff1a;网关 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发…...

“云计算一哥”一口气发布6个大模型、3nm芯片!多模态还要搞Any-to-Any

金磊 发自 拉斯维加斯量子位 | 公众号 QbitAI 就在刚刚&#xff0c;云计算一哥亚马逊云科技&#xff0c;在大模型这件事儿上搞了波大的—— 亚马逊CEO Andy Jassy亲自站台re:Invent24&#xff0c;发布自家新款AI多模态系列大模型&#xff0c;名曰Amazon Nova。 而且是一口气涵盖…...

pytest生成报告no tests ran in 0.01s

除了基本的环境配置、用例名要以test_开头&#xff0c;有个地方是我自己忽略了&#xff0c;在执行时没有指定用例文件&#xff0c;所以没有找到。 if __name__ __main__:pytest.main(["testcases/test_demo.py","-svq", __file__, --alluredir./allure-r…...

如何修改DNS解析?

DNS(域名系统)就像互联网的“电话簿”&#xff0c;负责将我们输入的网址转换为计算机能够理解的IP地址。如果DNS解析出现问题&#xff0c;访问网站就会受到影响。那我们该如何修改DNS解析呢?接下来&#xff0c;我们就来介绍一下这个话题。 为什么要修改DNS解析? 使用默认的…...

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…...

微服务组件LoadBalancer负载均衡

SpringCloud 从 2020.0.1 版本开始,移除了 Ribbon 组件&#xff0c;使⽤Spring Cloud LoadBalancer 组件来代 替 Ribbon 实现客户端负载均衡 loadbalancer负载均衡&#xff1a; 复制一份provider项目&#xff0c;服务名一致&#xff0c;端口号不一致&#xff0c;让consumer调…...

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…...

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…...

centos7 升级openssl并安装python3

参考文章&#xff1a;https://www.cnblogs.com/chuanzhang053/p/17653635.html 卸载已有版本 yum remove -y openssl openssl-devel下载1.1版本 wget https://www.openssl.org/source/openssl-1.1.1v.tar.gztar -zxf openssl-1.1.1v.tar.gz 查看openssl.conf文件的目录 fin…...