Spring加载properties文件的两种方式

在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修改源代码,这样更加方便。在Spring中也可以这么做,而且Spring有两种加载properties文件的方式:基于xml方式和基于注解方式。下面分别讨论下这两种方式。

1. 通过xml方式加载properties文件

        我们以Spring实例化dataSource为例,我们一般会在beans.xml文件中进行如下配置:

[html] view plaincopy
  1.  <!-- com.mchange.v2.c3p0.ComboPooledDataSource类在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 -->  
  2. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  3.     <property name="driverClass" value="com.mysql.jdbc.Driver" />  
  4.     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop" />  
  5.     <property name="user" value="root" />  
  6.     <property name="password" value="root" />  
  7. </bean>  
        现在如果我们要改变dataSource,我们就得修改这些源代码,但是我们如果使用properties文件的话,只需要修改那里面的即可,就不管源代码的东西了。那么如何做呢?

        Spring中有个<context:property-placeholder location=""/>标签,可以用来加载properties配置文件,location是配置文件的路径,我们现在在工程目录的src下新建一个conn.properties文件,里面写上上面dataSource的配置:

[plain] view plaincopy
  1. dataSource=com.mchange.v2.c3p0.ComboPooledDataSource  
  2. driverClass=com.mysql.jdbc.Driver  
  3. jdbcUrl=jdbc\:mysql\://localhost\:3306/shop  
  4. user=root  
  5. password=root  
        现在只需要在beans.xml中做如下修改即可:

[html] view plaincopy
  1. <context:property-placeholder location="classpath:conn.properties"/><!-- 加载配置文件 -->  
  2.   
  3. <!-- com.mchange.v2.c3p0.ComboPooledDataSource类在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 -->  
  4.  <bean id="dataSource" class="${dataSource}"> <!-- 这些配置Spring在启动时会去conn.properties中找 -->  
  5.     <property name="driverClass" value="${driverClass}" />  
  6.     <property name="jdbcUrl" value="${jdbcUrl}" />  
  7.     <property name="user" value="${user}" />  
  8.     <property name="password" value="${password}" />  
  9.  </bean>  
        <context:property-placeholder location=""/>标签也可以用下面的<bean>标签来代替,<bean>标签我们更加熟悉,可读性更强:

[html] view plaincopy
  1. <!-- 与上面的配置等价,下面的更容易理解 -->  
  2. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.     <property name="locations"> <!-- PropertyPlaceholderConfigurer类中有个locations属性,接收的是一个数组,即我们可以在下面配好多个properties文件 -->  
  4.         <array>  
  5.             <value>classpath:conn.properties</value>  
  6.         </array>  
  7.     </property>  
  8. </bean>  
        虽然看起来没有上面的<context:property-placeholder location=""/>简洁,但是更加清晰,建议使用后面的这种。但是这个只限于xml的方式,即在beans.xml中用${key}获取配置文件中的值value。

2. 通过注解方式加载properties文件

        还有一种就是通过注解的方式,在java代码中使用@Value注解来加载配置文件中的值。

        我们来看一个例子:假如我们要在程序中获取某个文件的绝对路径,我们很自然会想到不能在程序中写死,那么我们也可以卸载properties文件中。还是在src目录下新建一个public.properties文件,假设里面写了一条记录:

[plain] view plaincopy
  1. filePath=E\:\\web\\apache-tomcat-8.0.26\\webapps\\E_shop\\image  
        如果想在java代码中通过注解来获取这个filePath的话,首先得在beans.xml文件中配置一下注解的方式:

[html] view plaincopy
  1. <!-- 第二种方式是使用注解的方式注入,主要用在java代码中使用注解注入properties文件中相应的value值 -->  
  2. <bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  3.     <property name="locations"><!-- 这里是PropertiesFactoryBean类,它也有个locations属性,也是接收一个数组,跟上面一样  
  4.         <array>  
  5.             <value>classpath:public.properties</value>  
  6.         </array>  
  7.     </property>  
  8. </bean>  
        现在我们可以在java代码中使用注解来获取filePath的值了:

[java] view plaincopy
  1. @Component("fileUpload")  
  2. public class FileUploadUtil implements FileUpload {  
  3.       
  4.     private String filePath;  
  5.     @Value("#{prop.filePath}")   
  6.     //@Value表示去beans.xml文件中找id="prop"的bean,它是通过注解的方式读取properties配置文件的,然后去相应的配置文件中读取key=filePath的对应的value值  
  7.     public void setFilePath(String filePath) {  
  8.         System.out.println(filePath);  
  9.         this.filePath = filePath;  
  10.     }  
        注意要有set方法才能被注入进来,注解写在set方法上即可。在setFilePath方法中通过控制台打印filePath是为了在启动tomcat的时候,观察控制台有没有输出来,如果有,说明Spring在启动时,已经将filePath给加载好了,我们看一下控制台的启动信息:

        以上就是Spring加载properties配置文件的两种方式。实际上,上面基于xml方式中的PropertyPlaceholderConfigurer类和这里基于注解方式的PropertiesFactoryBean类都是继承PropertiesLoaderSupport,都是用来加载properties配置文件的。

        如有错误之处,欢迎留言指正~

转载于:https://www.cnblogs.com/lantx/p/7497744.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp判断json第一位_java 判断字符串是否为json格式

1&#xff0c;import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper mapper new ObjectMapper();Myclass myclass mapper.readValue(jsonStr , Myclass.class); //这里Myclass是我自己定义的类&#xff0c;里面有一系列的属性字段。jsonStr是需要传入的json参数…

(转)如何使用caffe的MATLAB接口

编译MatCaffe 转自: http://blog.csdn.net/ws_20100/article/details/50525879 使用如下命令编译MatCaffe make all matcaffe 1之后&#xff0c;你可以用以下命令测试MatCaffe&#xff1a; make mattest 1如果你在运行上面命令时&#xff0c;遇到如下错误&#xff1a;libstdc.s…

c++2010修复不了_汽车凹痕太小修复不了?汽车无痕修复是骗局还是技术不行?...

前段时间在网上看到一个推荐搜索说汽车凹痕太小修复不了&#xff0c;又是一个不知道从哪传出来的谣言。只听说过汽车凹陷变形太厉害修复不了的&#xff0c;没听说过凹陷的太小而修复不了的。但是我转念一想&#xff0c;能被搜索推荐说明搜遇到这个问题的人还挺多的&#xff0c;…

ege限制鼠标移动的函数_浅谈函数节流和函数防抖

什么是函数节流和函数防抖&#xff1f;下面本篇文章就来给大家浅谈一下函数节流和函数防抖。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。前言事件的触发权很多时候都属于用户&#xff0c;有些情况下会产生问题&#xff1a;向后台发…

〖Demo〗-- HAproxy配置文件操作

【HAproxy配置文件操作】 要求 1. 根据用户输入输出对应的backend下的server信息2. 可添加backend 和sever信息3. 可修改backend 和sever信息4. 可删除backend 和sever信息5. 操作配置文件前进行备份6 添加server信息时&#xff0c;如果ip已经存在则修改;如果backend不存在则创…

centos调整页面大小_这2种方法都能调整PDF文档的纸张大小

PDF文件大家都很熟悉了&#xff0c;在工作中是经常会遇到的&#xff0c;但是想对PDF文件进行修改和编辑的可能很多人都觉得为难。比如当你在阅读PDF文件时&#xff0c;发现PDF文档的页面尺寸不是自己想要的尺寸&#xff0c;要如何修改PDF的纸张大小呢&#xff1f;以下介绍2种简…

罗小黑用flash做的_中影星美好看罗小黑战记正式定档!

《罗小黑战记》定档的消息一发出&#xff0c;原微博已被转发45000次&#xff0c;大家真是太激动啦~罗小黑官博下热闹非凡在B站也同样壮观原是猫妖的小黑&#xff0c;在盗取宝珠后逃走&#xff0c;但被发现&#xff0c;而化为了一只猫&#xff0c;在街头流浪时&#xff0c;被小白…

An Overview of Cisco IOS Versions and Naming

An Overview of Cisco IOS Versions and Naming http://www.ciscopress.com/articles/article.asp?p2106547 By Sean Wilkins.Article is provided courtesy of Cisco Press.Date: Jun 28, 2013.SaveDiggDel.icio.usPrint Article Information Article Description   Versio…

click事件的累加绑定

click事件的累加绑定&#xff0c;绑定一次点击事件&#xff0c;执行多次。 在页面中为一个元素绑定事件&#xff0c;事件执行后页面未刷新且元素还在&#xff0c;然后你再次点击&#xff0c;元素又被绑定一个点击事件&#xff0c;这样第二次点击就会执行两次&#xff0c;以此类…

ubuntu 查找qt是否安装_Ubuntu Qt 安装教程--快速下载连接(网盘)

做个笔记以便忘了&#xff08;这个笔记我用到三次了&#xff0c;现在都能记住步骤了&#xff0c;Ubuntu也装了四五次了。折腾。。。&#xff09;先下载Qt的安装包 .run文件 &#xff08;三个途径下载&#xff09;1官方&#xff1a; http://download.qt.io/archive/qt/5.12/5.12…

C# 代理访问页面并获取数据

本来在找IWebDriver使用代理的方法&#xff0c;偶然获知这种的&#xff0c;记录并且共享 1 WebProxy proxyObject new WebProxy("125.31.19.26", 80);//str为IP地址 port为端口号 代理类2 HttpWebRequest Req (HttpWebRequest)WebRequest.Create("http://ip.c…

vscode用鼠标滚轮_前端开发神器 VSCode 使用总结

前端开发神器 VSCode 使用总结VSCode 是微软出品的&#xff0c;基于 Electron 和 TypeScript 的&#xff0c;集成了 git 版本管理和命令行终端&#xff0c;而且开源稳定&#xff0c;插件丰富&#xff0c;再搭配一款 Chrome 浏览器&#xff0c;可以说是前端开发神器了。安装指南…

python3 os_Python3 标准库:os

1.重命名import osos.rename(test.txt,x.txt) #重命名文件或目录imageimport osos.renames(a/123.txt,a/b/h.txt) #递归重命名文件image2.列出目录中的子目录和文件import osfilesos.listdir()for i in files:print(i)输出结果:image3.列出当前目录下的文件和文件夹以及文件夹下…

微信iOS收款到账语音提醒开发总结

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者&#xff1a;littleliang 一、背景 为了解决小商户老板们在频繁交易中不…

itextpdf添加表格元素_java使用iText生成pdf表格详解

首先需要你自己下载itext相关的jar包并添加引用&#xff0c;或者在maven中添加如下引用配置&#xff1a;com.lowagieiText2.1.5com.lowagieiText-rtf2.1.4com.lowagieiTextAsian2.1.4如下代码&#xff1a;package com.iText.create;import java.awt.Color;import java.io.File;…

Python map() 函数

功能&#xff1a;根据提供的函数对指定序列做映射 第一个参数 function 以参数序列中的每一个元素调用 function 函数&#xff0c;返回包含每次 function 函数返回值的新列表。 语法&#xff1a;map(function, iterable, ...) 参数&#xff1a;function:函数 iterable:一个或多…

vue的视图化创建项目_vue-cli3用图形化的方式创建项目

Vue脚手架可以快速生成Vue项目基础的架构。A.安装3.x版本的Vue脚手架&#xff1a;npm install -g vue/cliB.基于3.x版本的脚手架创建Vue项目&#xff1a;1).使用命令创建Vue项目命令&#xff1a;vue create my-project选择Manually select features(选择特性以创建项目)勾选特性…

Jmeter连接Mysql

1、将mysql-connector-java-5.1.7-bin.jar放入Jmeter安装目录的bin文件夹中 2、在顶层目录<测试计划>中加载驱动 3、添加JDBC Connection Configuration 4、配置数据库信息 1&#xff09;Variable Name不能为空 2&#xff09;DataBase URL 格式为&#xff1a;jdbc:mysql:…

胃net的放大内镜_李锐:内镜下的早癌诊断

写在前面&#xff1a;这是一篇很专业的文章&#xff0c;因为很多术语对于大多数朋友来说看的不是很明白。简单讲&#xff0c;这是让消化内镜医生看的&#xff0c;说的是怎么样才能发现更多的早癌。这里需要说明一下&#xff0c;很容易造成误解&#xff1a;早癌就在那里&#xf…

单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程

redis为什么这么快C语言实现&#xff0c;执行速度快纯内存操作&#xff0c;数据读写在内存中&#xff0c;异步持久化到磁盘丰富和高效的数据结构基于非阻塞的I/O多路复用机制单线程避免了上下文切换Redis单线程redis单线程的核心就是它基于一个假设&#xff1a;它在内存中执行的…