Spring的@PropertySource + Environment,@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value配合使用
@PropertySource注解可以配置读取单个或多个配置文件:
单个配置文件:
@PropertySource(value = “classpath:spring/config.properties”)
多个配置文件:
@PropertySource(value = {“classpath:spring/config.properties”,“classpath:spring/news.properties”})
@PropertySource注解使用有两种方式:
1、@PropertySource + Environment,通过@PropertySource注解将properties配置文件中的值存储到Spring的 Environment中,Environment接口提供方法去读取配置文件中的值,参数是properties文件中定义的key值。
2、@PropertySource(PropertySourcesPlaceholderConfigurer)+@Value
示例1:@PropertySource + Environment 在spring3.1中(不是spring3.0)还可以这样:
package com.dxz.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration
@ComponentScan(basePackages = "com.dxz.config")
@PropertySource(value = "classpath:spring/config.properties")
public class ServiceConfiguration {
@Autowired
Environment environment;
public ServiceConfiguration() {
System.out.println("ServiceConfiguration zheli");
}
//@Bean
public javax.sql.DataSource dataSource(){
String user = this.environment.getProperty("ds.user");
System.out.println(user);
return null;
}
}
配置文件config.properties:
key1=abc
key2=aaaaaaaaaaaaaaaaaaaa
key3=bbbbbbbbbbbbbbbbbbbbbbbbbbb
key4=cccccccccc
ds.user=admin
测试类:
package com.dxz.config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ServiceConfiguration.class);
ServiceConfiguration hc2 = (ServiceConfiguration) context.getBean("serviceConfiguration");
hc2.dataSource();
}
}
结果:
十一月 02, 2017 10:20:43 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3f91beef: startup date [Thu Nov 02 10:20:43 CST 2017]; root of context hierarchy
ServiceConfiguration zheli
admin
示例2: @PropertySource(PropertySourcesPlaceholderConfigurer)+@Value
创建Spring配置Class
package com.dxz.config2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@ComponentScan(basePackages = "com.dxz.config2")
public class AppConfigMongoDB {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
package com.dxz.config2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = "classpath:spring/config.properties")
public class MongoDBConfig {
//1.2.3.4
@Value("${key1}")
private String mongodbUrl;
//hello
@Value("${ds.user}")
private String defaultDb;
@Override
public String toString() {
return "MongoDBConfig [mongodbUrl=" + mongodbUrl + ", defaultDb=" + defaultDb + "]";
}
}
测试类:
package com.dxz.config2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test5 {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfigMongoDB.class);
MongoDBConfig ac = (MongoDBConfig)context.getBean("mongoDBConfig");
System.out.println(ac);
}
}
结果:
十一月 02, 2017 11:54:06 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3f91beef: startup date [Thu Nov 02 11:54:06 CST 2017]; root of context hierarchy
MongoDBConfig [mongodbUrl=abc, defaultDb=admin]
spring4版本
在Spring 4版本中,Spring提供了一个新的注解——@PropertySources,从名字就可以猜测到它是为多配置文件而准备的。
package com.dxz.config3;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;
@Component
@PropertySources({
@PropertySource("classpath:db.properties"),
//@PropertySource(value="classpath:db.properties", ignoreResourceNotFound=true),
@PropertySource("classpath:spring/config.properties")
})
public class AppConfig {
@Value("${key1}")
private String key1;
@Value("${key2}")
private String key2;
@Override
public String toString() {
return "AppConfig [key1=" + key1 + ", key2=" + key2 + "]";
}
}
spring的配置class
package com.dxz.config3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@ComponentScan(basePackages = "com.dxz.config3")
public class AppConfiguation {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
测试类:
package com.dxz.config3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test6 {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguation.class);
AppConfig ac = (AppConfig)context.getBean("appConfig");
System.out.println(ac);
}
}
结果:
另外在Spring 4版本中,@PropertySource允许忽略不存在的配置文件。先看下面的代码片段:
@Configuration
@PropertySource(“classpath:missing.properties”)
public class AppConfig {
//something
}
如果missing.properties不存在或找不到,系统则会抛出异常FileNotFoundException。
Caused by: java.io.FileNotFoundException:
class path resource [missiong.properties] cannot be opened because it does not exist
幸好Spring 4为我们提供了ignoreResourceNotFound属性来忽略找不到的文件
package com.dxz.config3;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;
@Component
@PropertySources({
//@PropertySource("classpath:db.properties"),
@PropertySource(value="classpath:db.properties", ignoreResourceNotFound=true),
@PropertySource("classpath:spring/config.properties")
})
public class AppConfig {
@Value("${key1}")
private String key1;
@Value("${key2}")
private String key2;
@Override
public String toString() {
return "AppConfig [key1=" + key1 + ", key2=" + key2 + "]";
}
}
最上面的AppConfiguation 的配置代码等于如下的XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.9leg.java.spring"/>
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:spring/config.properties</value>
</list>
</property>
</bean>
</beans>