美文网首页
Spring Boot-(2)配置文件

Spring Boot-(2)配置文件

作者: 会点代码的大叔 | 来源:发表于2017-11-06 14:04 被阅读216次

    Spring Boot使用一个全局的配置文件application.properties 或 application.yml,放在src/main/resources目录下。

    比如Tomcat默认端口号为8080,我们可以进行修改,在application.yml中添加:

    server: <--这里有个空格
      port: 8090  <--空两个port:空格8090
    

    这样配置后,启动Spring Boot项目时Tomcat端口变为8090。
    这时候就有一个疑问了,为什么这里写server和port就能让Tomcat的端口改变,为什么不能写成tomcatserver、tomcatport,找找是哪里去读这个配置的,怎么读取到的。

    首先,参考官方文档,写一个自己的配置,然后在java文件中读取:

    1.使用@Value:

    application.yml中添加

    myConfig: something
    

    java代码中可以直接使用

    @Value(value="${myConfig}")
    private String myConfig;
    

    2.使用@ConfigurationProperties:

    application.yml中添加

    ---
    #自定义的属性和值  
    myProps: 
      simpleProp: simplePropValue  
      arrayProps: 1,2,3,4,5  
      listProp1:  
        - name: abc  
          value: abcValue  
        - name: efg  
          value: efgValue  
      listProp2:  
        - config2Value1  
        - config2Vavlue2  
      mapProps:  
        key1: value1  
        key2: value2  
    

    增加YmlConfig.java,用于接收application.yml中配置的参数。

    package com.spring.lw.Towns.vo;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix="myProps") //application.yml中的myProps下的属性    
    public class YmlConfig {
        private String simpleProp;    
        private String[] arrayProps;    
        private List<Map<String, String>> listProp1 = new ArrayList<>(); //接收prop1里面的属性值    
        private List<String> listProp2 = new ArrayList<>(); //接收prop2里面的属性值    
        private Map<String, String> mapProps = new HashMap<>(); //接收prop1里面的属性值    
            
        public String getSimpleProp() {    
            return simpleProp;    
        }    
            
        public void setSimpleProp(String simpleProp) {    
            this.simpleProp = simpleProp;    
        }    
            
        public List<Map<String, String>> getListProp1() {    
            return listProp1;    
        }    
        public List<String> getListProp2() {    
            return listProp2;    
        }    
        
        public String[] getArrayProps() {    
            return arrayProps;    
        }    
        
        public void setArrayProps(String[] arrayProps) {    
            this.arrayProps = arrayProps;    
        }    
        
        public Map<String, String> getMapProps() {    
            return mapProps;    
        }    
        
        public void setMapProps(Map<String, String> mapProps) {    
            this.mapProps = mapProps;    
        } 
    }
    

    在Controller中使用配置好的参数:

    @RestController
    @RequestMapping(value="/user")
    @EnableConfigurationProperties({YmlConfig.class})  
    public class UserController {
        @Autowired  
        private YmlConfig ymlConfig; 
    
        @RequestMapping(value="/getProps")
        public List getArrayProps(){
        List list = new ArrayList();
        
        list.add(ymlConfig.getSimpleProp());
        list.add(ymlConfig.getArrayProps());
        list.add(ymlConfig.getListProp1());
        list.add(ymlConfig.getListProp2());
        list.add(ymlConfig.getMapProps());
        
        return list ;
    }
    

    当然上面例子中的simpleProp也可以使用@Value获取到:

    @Value(value="${myProps.simpleProp}")
    private String single;
    

    3.@ConfigurationProperties vs. @Value

    官方比较推荐使用@ConfigurationProperties,它支持Relaxed binding和Meta-data support。我用自己的话对这两个概念解释一下...

    • Relaxed binding:绑定的时候不需要完全按照完整的名称进行绑定,比如可以@ConfigurationProperties(prefix="person")表示person开头的配置。@Value需要严格的要求使用完整的名称。
    • Meta-data support:支持使用Meta-data。Spring boot的jars中,附带了metadata.json结尾的文件,这个文件可以帮助使用IDE的开发人员快速的完成代码的补全。就好像我们使用eclipse的时候,输入【类.】的时候,eclipse可以提示这个类里面的所有方法。当然使用这个功能的时候,需要使用Spring Tool Suite,要么直接下载STS使用,要么在现有的IDE里面安装插件。Spring Tool Suite,效果是这样的:
    image.png

    回到最上面的问题:为什么这里写server和port就能让Tomcat的端口改变。我们翻翻源代码看看是在哪里规定的。
    spring boot中有一个jar包,名称为:spring-boot-autoconfigure-1.5.4.RELEASE-sources.jar,这个jar专门负责自动配置的。Spring Boot提供的自动配置都是位于包 org.springframework.boot.autoconfigure之下,这个是Spring Boot提供的,而非第三方(如MyBatis-Spring-Boot-Starter)提供的。

    找到org.springframework.boot.autoconfigure.web.ServerProperties,可以server.port:

    @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
    public class ServerProperties
            implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
    
        /**
         * Server HTTP port.
         */
        private Integer port;
    
        ... ...
    

    好了,这就对应起来了。

    相关文章

      网友评论

          本文标题:Spring Boot-(2)配置文件

          本文链接:https://www.haomeiwen.com/subject/zwllmxtx.html