• springboot获取properties文件的配置内容(转载)


    1、使用@Value注解读取
    读取properties配置文件时,默认读取的是application.properties。

    application.properties:

    demo.name=Name
    demo.age=18

    Java代码:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    public class GatewayController {
     
        @Value("${demo.name}")
        private String name;
     
        @Value("${demo.age}")
        private String age;
     
        @RequestMapping(value = "/gateway")
        public String gateway() {
            return "get properties value by ''@Value'' :" +
                    //1、使用@Value注解读取
                    " name=" + name +
                    " , age=" + age;
        }
    
    }

    运行结果:

    这里,如果要把

                @Value("${demo.name}")
                private String name;
                @Value("${demo.age}")
                private String age;

    部分放到一个单独的类A中进行读取,然后在类B中调用,则要把类A增加@Component注解,并在类B中使用@Autowired自动装配类A,代码如下。

    类A:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
     
    @Component
    public class ConfigBeanValue {
     
        @Value("${demo.name}")
        public String name;
     
        @Value("${demo.age}")
        public String age;
    }

    类B:

    import cn.wbnull.springbootdemo.config.ConfigBeanValue;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    public class GatewayController {
     
        @Autowired
        private ConfigBeanValue configBeanValue;
     
        @RequestMapping(value = "/gateway")
        public String gateway() {
            return "get properties value by ''@Value'' :" +
                    //1、使用@Value注解读取
                    " name=" + configBeanValue.name +
                    " , age=" + configBeanValue.age;
        }
    }

    运行结果:

    注意:如果@Value${}所包含的键名在application.properties配置文件中不存在的话,会抛出异常:
    
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configBeanValue': Injection of autowired dependencies failed;
    nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'demo.name' in value "${demo.name}"

    2、使用Environment读取

    application.properties:

    demo.sex=男
    demo.address=山东

    代码

    import cn.wbnull.springbootdemo.config.ConfigBeanValue;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    public class GatewayController {
     
        @Autowired
        private ConfigBeanValue configBeanValue;
     
        @Autowired
        private Environment environment;
     
        @RequestMapping(value = "/gateway")
        public String gateway() {
            return "get properties value by ''@Value'' :" +
                    //1、使用@Value注解读取
                    " name=" + configBeanValue.name +
                    " , age=" + configBeanValue.age +
                    "<p>get properties value by ''Environment'' :" +
                    //2、使用Environment读取
                    " , sex=" + environment.getProperty("demo.sex") +
                    " , address=" + environment.getProperty("demo.address");
        }
    }

    运行结果:

    这里,我们在application.properties做如下配置:

    server.tomcat.uri-encoding=UTF-8
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.enabled=true
    spring.http.encoding.force=true
    spring.messages.encoding=UTF-8

    重新运行结果如下:

    3、使用@ConfigurationProperties注解读取
    在实际项目中,当项目需要注入的变量值很多时,上述所述的两种方法工作量会变得比较大,这时候我们通常使用基于类型安全的配置方式,将properties属性和一个Bean关联在一起,即使用注解@ConfigurationProperties读取配置文件数据。

    在srcmain esources下新建config.properties配置文件:

    demo.phone=10086
    demo.wife=self

    创建ConfigBeanProp并注入config.properties中的值:

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;
     
    @Component
    @ConfigurationProperties(prefix = "demo")
    @PropertySource(value = "config.properties")
    public class ConfigBeanProp {
     
        private String phone;
     
        private String wife;
     
        public String getPhone() {
            return phone;
        }
     
        public void setPhone(String phone) {
            this.phone = phone;
        }
     
        public String getWife() {
            return wife;
        }
     
        public void setWife(String wife) {
            this.wife = wife;
        }
    }
    @Component 表示将该类标识为Bean
    
    @ConfigurationProperties(prefix = "demo")用于绑定属性,其中prefix表示所绑定的属性的前缀。
    
    @PropertySource(value = "config.properties")表示配置文件路径。
    
     
    
    使用时,先使用@Autowired自动装载ConfigBeanProp,然后再进行取值,示例如下:
    import cn.wbnull.springbootdemo.config.ConfigBeanProp;
    import cn.wbnull.springbootdemo.config.ConfigBeanValue;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    public class GatewayController {
     
        @Autowired
        private ConfigBeanValue configBeanValue;
     
        @Autowired
        private Environment environment;
     
        @Autowired
        private ConfigBeanProp configBeanProp;
     
        @RequestMapping(value = "/gateway")
        public String gateway() {
            return "get properties value by ''@Value'' :" +
                    //1、使用@Value注解读取
                    " name=" + configBeanValue.name +
                    " , age=" + configBeanValue.age +
                    "<p>get properties value by ''Environment'' :" +
                    //2、使用Environment读取
                    " sex=" + environment.getProperty("demo.sex") +
                    " , address=" + environment.getProperty("demo.address") +
                    "<p>get properties value by ''@ConfigurationProperties'' :" +
                    //3、使用@ConfigurationProperties注解读取
                    " phone=" + configBeanProp.getPhone() +
                    " , wife=" + configBeanProp.getWife();
        }
    }

    运行结果:



    4.使用PropertiesLoaderUtils

    app-config.properties
    
    #### 通过注册监听器(`Listeners`) + `PropertiesLoaderUtils`的方式
    com.zyd.type=Springboot - Listeners
    com.zyd.title=使用Listeners + PropertiesLoaderUtils获取配置文件
    com.zyd.name=zyd
    com.zyd.address=Beijing
    com.zyd.company=in

    PropertiesListener.java 用来初始化加载配置文件

    package com.zyd.property.listener;
    
    import org.springframework.boot.context.event.ApplicationStartedEvent;
    import org.springframework.context.ApplicationListener;
    
    import com.zyd.property.config.PropertiesListenerConfig;
    
    /**
     * 配置文件监听器,用来加载自定义配置文件
     * 
     * @author <a href="mailto:yadong.zhang0415@gmail.com">yadong.zhang</a>
     * @date 2017年6月1日 下午3:38:25 
     * @version V1.0
     * @since JDK : 1.7
     */
    public class PropertiesListener implements ApplicationListener<ApplicationStartedEvent> {
    
        private String propertyFileName;
    
        public PropertiesListener(String propertyFileName) {
            this.propertyFileName = propertyFileName;
        }
    
        @Override
        public void onApplicationEvent(ApplicationStartedEvent event) {
            PropertiesListenerConfig.loadAllProperties(propertyFileName);
        }
    }

    PropertiesListenerConfig.java 加载配置文件内容

    package com.zyd.property.config;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    import org.springframework.beans.BeansException;
    import org.springframework.core.io.support.PropertiesLoaderUtils;
    
    /**
     * 第四种方式:PropertiesLoaderUtils
     * 
     * @author <a href="mailto:yadong.zhang0415@gmail.com">yadong.zhang</a>
     * @date 2017年6月1日 下午3:32:37
     * @version V1.0
     * @since JDK : 1.7
     */
    public class PropertiesListenerConfig {
        public static Map<String, String> propertiesMap = new HashMap<>();
    
        private static void processProperties(Properties props) throws BeansException {
            propertiesMap = new HashMap<String, String>();
            for (Object key : props.keySet()) {
                String keyStr = key.toString();
                try {
                    // PropertiesLoaderUtils的默认编码是ISO-8859-1,在这里转码一下
                    propertiesMap.put(keyStr, new String(props.getProperty(keyStr).getBytes("ISO-8859-1"), "utf-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (java.lang.Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void loadAllProperties(String propertyFileName) {
            try {
                Properties properties = PropertiesLoaderUtils.loadAllProperties(propertyFileName);
                processProperties(properties);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static String getProperty(String name) {
            return propertiesMap.get(name).toString();
        }
    
        public static Map<String, String> getAllProperty() {
            return propertiesMap;
        }
    }

    Applaction.java 启动类

    package com.zyd.property;
    
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.zyd.property.config.PropertiesListenerConfig;
    import com.zyd.property.listener.PropertiesListener;
    
    /**
     * @author <a href="mailto:yadong.zhang0415@gmail.com">yadong.zhang</a>
     * @date 2017年6月1日 下午3:49:30 
     * @version V1.0
     * @since JDK : 1.7
     */
    @SpringBootApplication
    @RestController
    public class Applaction {
        /**
         * 
         * 第四种方式:通过注册监听器(`Listeners`) + `PropertiesLoaderUtils`的方式
         * 
         * @author zyd
         * @throws UnsupportedEncodingException
         * @since JDK 1.7
         */
        @RequestMapping("/listener")
        public Map<String, Object> listener() {
            Map<String, Object> map = new HashMap<String, Object>();
            map.putAll(PropertiesListenerConfig.getAllProperty());
            return map;
        }
    
        public static void main(String[] args) throws Exception {
            SpringApplication application = new SpringApplication(Applaction.class);
            // 第四种方式:注册监听器
            application.addListeners(new PropertiesListener("app-config.properties"));
            application.run(args);
        }
    }

  • 相关阅读:
    Vue --》this.$set()的神奇用法
    vue --》路由query 编程式导航传值与监听
    elementUI -->实现简单的购物车
    vue--》如何使用wacth监听对象的属性变化?
    laravel redis 删除指定前缀的 key
    php in_array 的一个坑
    laravel/lumen Command 的构造函数需要注意的地方
    git 合并连续的几个 commits
    盘点 php 里面那些冷门又实用的小技巧
    mockery expectation 覆盖
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/10338789.html
Copyright © 2020-2023  润新知