Spring Boot-(2)配置文件

2017-11-06  本文已影响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。我用自己的话对这两个概念解释一下...

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;

    ... ...

好了,这就对应起来了。

上一篇下一篇

猜你喜欢

热点阅读