Spring加载properties文件的两种方式

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

目录(?)[+]

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

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

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

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. filePath=E\:\\web\\apache-tomcat-8.0.26\\webapps\\E_shop\\image  
        如果想在java代码中通过注解来获取这个filePath的话,首先得在beans.xml文件中配置一下注解的方式:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  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配置文件的。

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

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
63 0
|
6月前
|
缓存 Java 容器
【Spring IOC容器加载过程】
【Spring IOC容器加载过程】
|
6月前
|
XML Java 数据格式
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
36 0
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
|
4月前
|
IDE Java 开发工具
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
45 0
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
|
4月前
|
druid Java 关系型数据库
Spring案例:数据源对象管理及加载properties文件
Spring案例:数据源对象管理及加载properties文件
33 0
|
9月前
|
Java 程序员 Spring
Spring文件第四课SpringIOC 的三种方案利用注解的方式.(一)
Spring文件第四课SpringIOC 的三种方案利用注解的方式.(一)
65 0
|
5月前
|
存储 Java Spring
Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用
使用 Resource 加载资源 要使用 Resource 接口加载资源,首先需要获取一个 ResourceLoader 实例,通常可以通过依赖注入来获得。接下来,您可以使用 ResourceLoader 来获取 Resource 对象,然后使用它来访问资源的内容。
|
5月前
|
消息中间件 Java 应用服务中间件
Spring Boot 推荐的基础 POM 文件
Spring Boot 推荐的基础 POM 文件
|
6月前
|
XML 存储 Java
【Spring IoC容器的加载过程】
【Spring IoC容器的加载过程】
|
7月前
|
XML Java 数据格式
spring配置文件可以通过一个总的xml文件导入其他xml文件配置
spring配置文件可以通过一个总的xml文件导入其他xml文件配置