Spring3.1新属性管理API:PropertySource、Environment、Profile(四)

2014-11-24 03:26:58 · 作者: · 浏览: 3
urce。

Profile

profile,剖面,大体意思是:我们程序可能从某几个剖面来执行应用,比如正式机环境、测试机环境、开发机环境等,每个剖面的配置可能不一样(比如开发机可能使用本地的数据库测试,正式机使用正式机的数据库测试)等;因此呢,就需要根据不同的环境选择不同的配置;如果用过maven,maven中就有profile的概念。

profile有两种:

默认的:通过“spring.profiles.default”属性获取,如果没有配置默认值是“default”

明确激活的:通过“spring.profiles.active”获取

查找顺序是:先进性明确激活的匹配,如果没有指定明确激活的(即集合为空)就找默认的;配置属性值从Environment读取。

API请参考Environment部分。设置profile属性,常见的有三种方式:

一、启动Java应用时,通过-D传入系统参数

-Dspring.profiles.active=dev

二、如果是web环境,可以通过上下文初始化参数设置

    
  
        
   
    spring.profiles.active
   
        
   
    dev
   
    
  

三 、通过自定义添加PropertySource

Map
  
    map = new HashMap
   
    (); map.put("spring.profiles.active", "dev"); MapPropertySource propertySource = new MapPropertySource("map", map); env.getPropertySources().addFirst(propertySource);
   
  

四、直接设置Profile

env.setActiveProfiles("dev", "test");

以上方式都可以设置多个profile,多个之间通过如逗号/分号等分隔。

接着我们就可以通过如下API判断是否激活相应的Profile了:

if(env.acceptsProfiles("dev", "test"))) {
    //do something
}
它们之间是或的关系;即找到一个即可;如果有人想不匹配某个profile执行某些事情,可以通过如"!dev" 即没有dev激活时返回true。

当然这种方式还不是太友好,还需要我们手工编程使用,稍候会介绍如何更好的使用它们。

${key}占位符属性替换器,配置如下:

    
  

location:表示属性文件位置,多个之间通过如逗号/分号等分隔;

file-encoding:文件编码;

ignore-resource-not-found:如果属性文件找不到,是否忽略,默认false,即不忽略,找不到将抛出异常

ignore-unresolvable:是否忽略解析不到的属性,如果不忽略,找不到将抛出异常

properties-ref:本地java.util.Properties配置

local-override:是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性

system-properties-mode:系统属性模式,ENVIRONMENT(默认),NEVER,OVERRIDE

ENVIRONMENT:将使用Spring 3.1提供的PropertySourcesPlaceholderConfigurer,其他情况使用Spring 3.1之前的PropertyPlaceholderConfigurer

如果是本地覆盖模式:那么查找顺序是:properties-ref、location、environment,否则正好反过来;

OVERRIDE: PropertyPlaceholderConfigurer使用,因为在spring 3.1之前版本是没有Enviroment的,所以OVERRIDE是spring 3.1之前版本的Environment

如果是本地覆盖模式:那么查找顺序是:properties-ref、location、System.getProperty(),System.getenv(),否则正好反过来;

NEVER:只查找properties-ref、location;

order:当配置多个 时的查找顺序,关于顺序问题请参考:http://www.iteye.com/topic/1131688

具体使用请参考如下文件中的如dataSource:

https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-config.xml

@PropertySource()

Spring 3.1提供的Java Config方式的注解,其属性会自动注册到相应的Environment;如:

@Configuration
@PropertySource(value = "classpath:resources.properties", ignoreResourceNotFound = false)
public class AppConfig {
}

接着就可以使用env.getProperty("encoding")得到相应的属性值。

另外如果想进行Bean属性的占位符替换,需要注册PropertySourcesPlaceholderConfigurer:

@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
如上配置等价于XML中的 配置。

如果想导入多个,在Java8之前需要使用@PropertySources注册多个@PropertySource()。

此处要注意:

使用 不会自动把属性注册到Environment中,而@PropertySource()会;且在XML配置中并没有@PropertySource()等价的XML命名空间配置,如果需要,可以自己写一个。

占位符替换

使用Environment属性替换,如:

@PropertySource(value = "classpath:${env}/resources.properties")

@ComponentScan(basePackages = "com.sishuok.${package}")

@ImportResource(value = {"classpath:${env}/cfg.xml"})

@Value("${env}")

new ClassPathXmlApplicationContext("classpath:${env}/cfg.xml")

使用PropertySourcesPlaceholderConfigurer / PropertyPlaceholderConfigurer进性Bean属性替换,如:

  
        
   
        
   
        
   
        
   

  

SpEL表达式:

请参考【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL―跟我学spri