• 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>
  • 相关阅读:
    最高的牛
    激光炸弹(二维前缀和)
    汉诺塔问题
    费解的开关
    Hamilton路径(模板题)
    大臣的旅费【树型dp + 求树最长链】
    [蓝桥杯2018初赛]全球变暖
    操作集景
    [蓝桥杯2018初赛]倍数问题
    一些数学公式
  • 原文地址:https://www.cnblogs.com/duanxz/p/2756362.html
Copyright © 2020-2023  润新知