在开发过程当中需要用到配置信息,这些信息不能进行硬编码,这时配置文件是一个比较好的方式,java提供了properties格式的文件,以键值对的方式保存信息,在读取的时候通过键获得键对应的值,spring提供了读取properties文件的支持,下面看具体的配置,

一、<context:property-placeholder location=""/>标签

在项目中经常用到数据库连接,连接数据库需要一些参数:driver、url、username、password,这些信息通常保存在properties文件中,如,在我的项目src目录下有db.properties文件,文件内容,

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.8.32:3306/test
db.username=root
db.passwd=root

现在要使用spring加载此文件,我们看spring如何配置,在spring的配置文件中有<context:property-placeholder location="classpath:db.properties"/>标签,此标签支持单个文件的加载,不过可以使用通配符,如,classpath:db*.properties,这里指定了src下的db.properties文件,那么如何使用加载的文件呢,可以使用${db.driver},下面看一个在数据库连接池中使用的例子,

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.passwd}"></property>
</bean>

在spring的配置文件中可以使用上面的方式获得db.properties文件中的值,

那么,现在我要在java类中使用db.properties文件中的值呢,可以使用@Value("${db.driver}"),使用这样一个注解别可以给类中的属性赋值,如下

package com.cn.study.day2;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Configuration {
@Value("${db.driver}")
private String dbDriver;
@Value("${db.url}")
private String dbUrl;
@Value("${db.username}")
private String dbUsername;
@Value("${db.passwd}")
private String dbPasswd;
public String getDbDriver() {
return dbDriver;
}
public String getDbUrl() {
return dbUrl;
}
public String getDbUsername() {
return dbUsername;
}
public String getDbPasswd() {
return dbPasswd;
} }

这里把注解用在了属性上面,也可以用在setXXX方法上,下面是测试代码,

//cpac是ClassPathXmlApplicationContext的一个实例对象
Configuration con=(Configuration)cpac.getBean("configuration"); System.out.println(con.getDbDriver());
System.out.println(con.getDbUrl());
System.out.println(con.getDbUsername());
System.out.println(con.getDbPasswd());

打印结果如下,

com.mysql.jdbc.Driver
jdbc:mysql://192.168.8.32:3306/test
root
root

以上是在java类中使用properties文件的例子。
二、PropertyPlaceholderConfigurer类

配置PropertyPlaceholderConfigurer类的bean

<bean id="appProperty" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<array>
<value>classpath:quartz.properties</value>
<value>classpath:db.properties</value> </array>
</property>
</bean>

使用这种方式可以指定多个文件,只要配置多个<value>标签即可,这种方式和<context:property-placeholder location="classpath:db.properties"/>方式是一样的。使用方式和第一种是一致的。

<context:property-placeholder location="classpath:db.properties"/>和配置PropertyPlaceholderConfigurer类的方式在spring的配置文件中只有一个起作用,即,假如都配置了,只有最先配置的才会被配置文件加载到,因为spring容器采用反射扫描机制,如果已经有一个PropertyPlaceholderConfigurer类的实例,那么就不会再创建了,因此使用其中一种方式即可

三、PropertiesFactoryBean类

可以配置此类,如下,

<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:quartz.properties</value>
<value>classpath:db.properties</value>
</list>
</property>
</bean>

要使用这种方式加载的properties文件,需要使用#{beanId['键']},如上面的,#{configProperties['db.url']}使用这种方式便可以得到db.url的值,

如,数据库连接中,

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>#{configProperties['db.url']}</value>
</property>
<property name="username">
<value>#{configProperties['db.username']}</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

上面的方式混合使用了${db.driver}和#{configProperties['db.url']}的方式,这两种方式都是可以的,

在java代码中的使用方式也是使用注解@Value,但是值是#{configProperties['db.url']},Z@Value("#{configProperties['db.url']}"),如下,

@Value("#{configProperties['db.username']}")
private String dbUsername;

此注解用在setXXX方法上也是可以的。

上面是三种spring加载properties文件的方式,有人会问,为什么在配置时使用了locations、location这样的属性呢,下面是一个有关properties的UML类图,

这个类图说明了各个类之间的继承关系,其中locations、location都是在共同的父类PropertiesLoaderSupport中定义的,这是一个抽象类。

好了,关于spring加载properties的内容就说那么多;其中源码还得继续研究呢。

有不正之处欢迎指出,谢谢!

spring入门(二)【加载properties文件】的更多相关文章

  1. spring 如何动态加载properties文件的内容

    1. 在xml中配置你的properties路径: <bean id="messageSource" class="org.springframework.cont ...

  2. Spring -09 -在Spring工程 中加载 properties 文件 -为某个属性添加注解赋初值

    1.在src 下新建 xxx.properties 文件,不要任意加空格,注明jdbc等标识名!2.在spring 配置文件中先引入xmlns:context,在下面添加2.1如果需要记载多个配置文件 ...

  3. spring配置数据源(加载properties文件)

    1.在spring中引入properties配置文件需要引入context的命名空间和真实地址 2.然后加载文件 需要注意的是这是采用的是set注入方式,所以name属性值必须是连接池set方法名去掉 ...

  4. Spring加载properties文件的属性的值

    要使用配置文件的值首先在spring.xml配置加载properties文件 <context:property-placeholder location="classpath:ife ...

  5. Spring加载properties文件的两种方式

    在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...

  6. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(12):XML配置自动扫描包,自动加载*.properties文件

    一.XML和注解组合使用 前几篇的测试案例都是在Java类中配置,现在换一种使用方式,在XML中配置,使Spring IoC容器在启动之后自动去扫描配置的包路径,扫描加载指定路径下的propertie ...

  7. xml文件 加载properties文件的两种方法与注意事项

    1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException  和   java.lang. ...

  8. Java开发学习(八)----IOC/DI配置管理第三方bean、加载properties文件

    前面的博客都是基于我们自己写的类,现在如果有需求让我们去管理第三方jar包中的类,该如何管理? 一.案例:数据源对象管理 本次案例将使用数据源Druid和C3P0来配置学习下. 1.1 环境准备 学习 ...

  9. java加载properties文件的六中基本方式实现

    java加载properties文件的方式主要分为两大类:一种是通过import java.util.Properties类中的load(InputStream in)方法加载: 另一种是通过impo ...

随机推荐

  1. iOS-数据持久化-SQlite3

    SQLite3简单介绍 1.ios中数据的存储方式 (1)Plist(NSArray\NSDictionary) (2)Preference(偏好设置\NSUserDefaults) (3)NSCod ...

  2. Android WebView 开发教程

    声明在先:必须在AndroidMainfest.xml 里面声明权限,否则在Java里面编写的所有WebView浏览网页的代码都无法正常使用 <uses-permission android:n ...

  3. javascript原型对象prototype

    “我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.” 引用类型才具有prototype属性 ...

  4. writing-mode改变文字书写方式

    古代书写方式都是垂直方向上的,如果要实现这种效果的话,还是挺麻烦的,不过现在CSS3有一个"writing-mode"属性,它可以改变文字的书写方式. writing-mode:h ...

  5. JS中的匿名函数

    整理自:http://www.cnblogs.com/playerlife/archive/2012/10/17/2727683.html 一.什么是匿名函数? 在Javascript定义一个函数一般 ...

  6. Unity3D 简单的倒计时

    using System; using UnityEngine; using System.Collections; public class TimeCountdown : MonoBehaviou ...

  7. 信息加密之非对称加密算法RSA

    前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...

  8. Android进程间通信之socket通信

    用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...

  9. 微信小程序中rpx与rem单位使用

    原作者: 小小小   来自: 授权地址 本文讲解rpx和rem应用于微信小程序,如果你还没有入门,建议先从下面看起: 微信小程序官方文档web app变革之remrpx单位官方文档rpx单位基础介绍 ...

  10. Spring MVC异常处理详解

    Spring MVC中异常处理的类体系结构 下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要 ...