通过Spring读取properties配置文件

原文地址

一般properties文件,用于在代码块中读取,并給变量赋值。但是,Spring可以Bean XML方式定义(注册Bean)中,可以通过${属性名}使用properties文件配置的值。或者在代码中使用@Value注解读取properties的属性值。
所以用途有两种:

1. 用途

 

1.1.  Spinrg的Bean XML定义中,可以通过${属性名}使用properties文件配置的值

首先,必须先加载properties配置文件,方式有两种,如下

方式一:

[html]  view plain  copy
  1. <!--   
  2.       用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值  
  3.       用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值  
  4.              方法1:注解在字段上,给字段赋值  
  5.              方法2:注解在字段的setter方法中赋值             
  6. -->  
  7. <context:property-placeholder location="classpath:jdbc.properties"/>  

方式二:

[html]  view plain  copy
  1. <!--   
  2.       用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值  
  3.       用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值  
  4.              方法1:注解在字段上,给字段赋值  
  5.              方法2:注解在字段的setter方法中赋值             
  6. -->  
  7. <bean id="propertyConfigurer"  
  8.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  9.       <property name="location">  
  10.           <value>/WEB-INF/configs/sqlServer.properties</value>  
  11.       </property>  
  12. </bean>  

可以清楚的看到,方式一,非常地简洁,但是如果要使用多个properties就可能实现不了,其实可以通过通配符实现,会有点麻烦。

接着,就可以在Bean的定义中,使用properties中的属性值,如下

[html]  view plain  copy
  1. <bean id="dataSource"  
  2.       class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  3.       <property name="driverClassName">  
  4.           <value>${jdbc.driver}</value>  
  5.       </property>  
  6.       <property name="url" >  
  7.           <value>${jdbc.url}</value>  
  8.       </property>  
  9.       <property name="username" >  
  10.           <value>${jdbc.user}</value>  
  11.       </property>  
  12.       <property name="password">  
  13.           <value>${jdbc.pwd}</value>  
  14.       </property>  
  15. </bean>  

 

1.2.  使用@Value注解读取properties文件配置的值,再给字段赋值

@Value注解是Spring 3.0 之后引入的新特性 

@Value的值有三种类型,#{} 、${} 和 #{'${}'} ,其实是#{}和${}这两种类型,#{'${}'} 这种是前两种的嵌套使用,下面分别介绍

1)  #{expression?:default value}

     #{} 花括号里面的是SpEL表达式(即Spring Expression Language),?: 前面的是表达式,?: 后面的是默认值,这种方式非常地灵活,可以直接取bean对象的字段值!SpEL表达式的介绍,请看官方参考资料http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html

     但是,这种方式下,有个缺陷,那就是 properties配置文件中的属性名称不能带点,否则取不到值,会报错

如 file.uploadpath = E:\\360Downloads\\temp , 读取该属性值,就会报错,如下

[java]  view plain  copy
  1. @Value("#{prop.file.uploadpath}")  
  2. private String uploadPath;  
[html]  view plain  copy
  1. Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'file' cannot be found on object of type 'java.util.Properties' - maybe not public?  

     要使用这种类型的Value值,实现方式有两种,如下

    方式一:

[html]  view plain  copy
  1. <!--   
  2.         用途:可以使用@Value("#{prop.属性名}")注解读取properties文件配置的值,再给字段赋值  
  3.              方法1:注解在字段上,给字段赋值  
  4.              方法2:注解在字段的setter方法中赋值  
  5.              注意:@Value("#{prop.属性名}") 中的 prop 是 注册的PropertiesFactoryBean的 Bean ID  
  6. -->  
  7. <bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  8.     <property name="locations">  
  9.         <array>  
  10.             <value>classpath:fileupload.properties</value>  
  11.         </array>  
  12.     </property>  
  13. </bean>  

    方式二:

[html]  view plain  copy
  1. <!--   
  2.         用途:可以使用@Value("#{prop.属性名}")注解读取properties文件配置的值,再给字段赋值  
  3.              方法1:注解在字段上,给字段赋值  
  4.              方法2:注解在字段的setter方法中赋值  
  5.              注意:@Value("#{prop.属性名}") 中的 prop 是 注册的PropertiesFactoryBean的 Bean ID  
  6. -->  
  7. <util:properties id="prop" location="classpath:fileupload.properties"/>  

       可以清楚的看到,方式二,非常地简洁,但是如果要使用多个properties就可能实现不了,其实可以通过通配符实现,会有点麻烦。

接下来,看demo

fileupload.properties文件:

[html]  view plain  copy
  1. name=zengyanhui  
  2. age=12  

Test.java:

[java]  view plain  copy
  1. package edu.mvcdemo.service;  
  2.   
  3. import org.springframework.beans.factory.annotation.Value;  
  4. import org.springframework.context.annotation.Scope;  
  5. import org.springframework.stereotype.Component;  
  6.   
  7. /** 
  8.  * @编写人: yh.zeng 
  9.  * @编写时间:2017-7-26 下午11:04:10 
  10.  * @文件描述: todo 
  11.  */  
  12. @Component("test")  
  13. @Scope("singleton")  
  14. public class Test {  
  15.     @Value("#{prop.name}")  
  16.     private String name;  
  17.       
  18.     @Value("#{prop.age}")  
  19.     private String age;  
  20.       
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.   
  29.     public String getAge() {  
  30.         return age;  
  31.     }  
  32.   
  33.     public void setAge(String age) {  
  34.         this.age = age;  
  35.     }  
  36.       
  37. }  

SpringBeanUtilsTest.java:

[java]  view plain  copy
  1. package edu.mvcdemo.utils;  
  2.   
  3. import edu.mvcdemo.service.Test;  
  4. import junit.framework.TestCase;  
  5.   
  6. /** 
  7.  * @编写人: yh.zeng 
  8.  * @编写时间:2017-7-26 下午11:09:38 
  9.  * @文件描述: todo 
  10.  */  
  11. public class SpringBeanUtilsTest  extends TestCase{  
  12.   
  13.     public void test1(){  
  14.         SpringBeanUtils.setFilePath("src/springCfg/applicationContext-base.xml");  
  15.         Test test = (Test) SpringBeanUtils.getBean("test");  
  16.         System.out.println("name="+test.getName());  
  17.         System.out.println("age="+test.getAge());  
  18.     }  
  19.       
  20. }  

程序运行结果:

[plain]  view plain  copy
  1. [INFO][2017-07-27 23:50:59][AbstractApplicationContext:583] - Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@b8d805: startup date [Thu Jul 27 23:50:59 CST 2017]; root of context hierarchy  
  2. [INFO][2017-07-27 23:50:59][XmlBeanDefinitionReader:317] - Loading XML bean definitions from file [D:\EclipseWorkspace\MavenSpringMvcDemo\src\springCfg\applicationContext-base.xml]  
  3. name=zengyanhui  
  4. age=12  

2)${property:default value}

    ${}这种值,只用来读取properties配置文件中的属性值, :  前面的是属性名称,:  后面的是默认值。这种类型的值,却可以读取带点的属性值,如 file.uploadpath = E:\\360Downloads\\temp,可以使用@Value("${file.uploadpath}")读取

     要使用这种方式的Value,有两种实现方式,如下

     方式一:

[html]  view plain  copy
  1. <!--   
  2.         用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值  
  3.         用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值  
  4.                方法1:注解在字段上,给字段赋值  
  5.                方法2:注解在字段的setter方法中赋值             
  6. -->  
  7. <bean id="propertyConfigurer"    
  8.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    
  9.       <property name="location">    
  10.           <value>classpath:fileupload.properties</value>    
  11.       </property>    
  12. </bean>    

      方式二:

[html]  view plain  copy
  1. <!--   
  2.         用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值  
  3.         用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值  
  4.                方法1:注解在字段上,给字段赋值  
  5.                方法2:注解在字段的setter方法中赋值             
  6. -->  
  7. <context:property-placeholder  location="classpath:fileupload.properties"/>  

可以清楚的看到,方式二,非常地简洁,但是如果要使用多个properties就可能实现不了,其实可以通过通配符实现,会有点麻烦。

下面看demo:

[java]  view plain  copy
  1. package edu.mvcdemo.service;  
  2.   
  3. import org.springframework.beans.factory.annotation.Value;  
  4. import org.springframework.context.annotation.Scope;  
  5. import org.springframework.stereotype.Component;  
  6.   
  7. /** 
  8.  * @编写人: yh.zeng 
  9.  * @编写时间:2017-7-26 下午11:04:10 
  10.  * @文件描述: todo 
  11.  */  
  12. @Component("test")  
  13. @Scope("singleton")  
  14. public class Test {  
  15.     @Value("${name}")  
  16.     private String name;  
  17.       
  18.     @Value("${age}")  
  19.     private String age;  
  20.       
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.   
  29.     public String getAge() {  
  30.         return age;  
  31.     }  
  32.   
  33.     public void setAge(String age) {  
  34.         this.age = age;  
  35.     }  
  36.   
  37. }  

程序运行结果:

[plain]  view plain  copy
  1. [INFO][2017-07-27 23:50:59][AbstractApplicationContext:583] - Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@b8d805: startup date [Thu Jul 27 23:50:59 CST 2017]; root of context hierarchy  
  2. [INFO][2017-07-27 23:50:59][XmlBeanDefinitionReader:317] - Loading XML bean definitions from file [D:\EclipseWorkspace\MavenSpringMvcDemo\src\springCfg\applicationContext-base.xml]  
  3. name=zengyanhui  
  4. age=12  

 (3)#{'${}'}

    这种类型的Value值,是#{}里面嵌套${}使用,所以必须按照上述的(1)(2)两种类型的实现方式,配置properties文件,才可以使用这种方式的值

[java]  view plain  copy
  1. @Value("#{'${age}'}")  
  2. private String age;  

 

参考资料:

http://www.mkyong.com/spring3/spring-value-default-value/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值