Spring Boot-(2)配置文件
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,效果是这样的:
回到最上面的问题:为什么这里写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;
... ...
好了,这就对应起来了。