Spring Boot配置,读取配置文件
Spring Boot配置,读取配置文件
Spring Boot简化了Spring配置的管理和读取,只需要一个application.properties,并提供了多种读取配置文件的方式。
一、配置Spring Boot
Spring Boot默认启动的是8080端口,Web上下文是"/"。可以通过配置application.properties来重新配置Spring Boot。
SpringBoot使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改。
- application.properties
- application.yml
这两个配置文件使我们springboot启动的时候回默认加载的配置文件。
配置文件放在src/main/resources目录或者类路径/config下,这个配置文件的路径是有优先级的。
1.1 服务器配置
若想更换其他端口,需配置server.port,如
server.port=9000
也可以在命令行中指定启动端口,比如传入参数-server.port=9000:
java -jar shop.jar --server.port=9000
或者传入虚拟机系统属性:(较为适用)
java -Dserver.port=9000 -jar shop.jar
Spring Boot默认为应用配置的上下文访问目录是"/",可以通过配置文件或者命令行,配置server-context-path:
server-servlet.context-path=/config
常用的服务器配置属性表:
属性 | 描述 |
---|---|
server.address | 服务器IP绑定地址,如果你的主机有多个网卡,可以绑定一个IP地址 |
server.session.timeout | 会话过期时间,以秒为单位 |
server.error.path | 服务器出错后的处理路径/error |
server.servlet.contextpath | Spring Boot应用的上下文 |
server.port | Spring Boot应用监听端口 |
1.2 使用其他Web服务器
Spring Boot内置了Tomcat,同时还支持Jetty、Undertow作为Web服务器,使用这些应用服务器,只需要引入相应的starter。
推荐使用Undertow。
server.tomcat.*包含了Tomcat的相关配置,较为重要的如下:
# 打开Tomcat的访问日志
server.tomcat.accesslog.enabled=true
# 访问日志所在的目录
server.tomcat.accesslog.directory=logs
# 允许HTTP请求缓存到请求队列的最大个数,默认不限制
server.tomcat.accept-count=
# 最大连接数,默认不限制,如果一旦连接数到达,剩下的连接将会保存到请求缓存队列里,也就是accept-count指定队列
server.tomcat.max-connections=
# 最大工作线程数
server.tomcat.max-threads=
# HTTP POST内容最大长度,默认不限制
server.tomcat.max-http-post-size
1.3 配置启动信息
默认启动后,控制台打印"Spring":
可以在classpath中增加banner.txt,显示你自己的输出信息。在Spring Boot项目的resources目录下新建一个banner.txt,内容如下:
#####Hello , hhhhh
再次运行,会发现启动信息已经改变。
也可设置banner.gif(png,jpg),控制台自动将图片转为ASCII字符,作为启动信息输出,将图片复制到resources目录下即可。
banner.charset=UTF-8 # banner.txt 字符集
banner.location=classpath:banner.txt
banner.image.location=classpath:banner.gif # 如果使用图片,图片的位置可以使用jgp/png
banner.image.width= 76 # 图片宽度,这里指转为字符的个数,越多越清楚
banner.image.heigjt=76 # 图片长度
banner.image.margin= 2 # 图片与左边的间距,默认为2个字符
1.4 配置浏览器显示ico
在项目resources目录下新建一个static目录,在static目录下创建images目录,将项目的favicon.ico放在images目录下,每个页面添加以下样式即可:
<link rel="shorcut icon" href="/images/apple.ico">
1.5 Yaml语法
YAML支持的三种数据结构。
- 字面量:普通的值。(数字,字符串,布尔)
- 对象:键值对的集合。(Map)
- 数组:一组按次序排列的值。(List,Set)
1.5.1 字面量
YAML中字面量属于普通的值。以key: value来表示,value前必须带一个空格。
字面量,字符串默认不需要单双引号。
双引号:会转义字符,特殊字符会被转义。(name: “SimpleWu\n lisi” //输出:SimpleWu换行 lisi)
单引号:不会转义字符,特殊字符不会被转义。(name: ‘SimpleWu\n lisi’ //输出:SimpleWu\n lisi)
Copyserver:
port: 8081
1.5.2 对象、Map
在YAML中,对象和Map都是以键值对的方式表示。在下一行来编写属性和值得关系,注意缩进。
Copyusers:
firstName: SimpleWu
email: lovelyWu98k@gmail.com
或者:
Copyusers: {
firstName: zhangsan,
email: lovelyWu98k@gmail.com
}
1.5.3 数组
用-值得方式来表示数组中的一个元素。
Copyusers:
- SimpleWu
- lovelyWu98k@gmail.com
- addressisnot
Copyusers: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
二、日志配置
默认情况下,不需要对日志做任何配置就可以使用,Spring Boot使用LogBack作为日志的实现,使用apache Commons Logging作为日志接口。
public class HelloworldController {
private Log log = LogFactory.getLog(HelloworldController.class);
...
}
日志每行格式内容有:
- 日期和时间;
- 日志级别,有ERROR、WARN、INFO、DEBUG和TRACE;
- 进程id,Spring Boot应用的进程id;
- [xxx],线程的名称;
- 类名;
- 消息体。
默认情况下,INFO级别以上的信息才会打印到控制台,可以自己设定日志输出级别
,比如在application.properties中加入以下代码:
logging.level.root=info
# org包下的日志级别
logging.level.org=warn
logging.level.com.yourcorp=debug
指定默认的级别是INFO,org开头的类,日志级别是WARN。
Spring Boot默认并输出日志到文件,可以在application.properties中指定日志输出:
logging.file = my.log
也可指定日志存放的路径,如:
logging.path=e:/temp/log
当日志到达10MB的时候,会自动冲洗生成一个新日志文件。
Spring Boot支持对控制台日志输出和文件输出进行格式控制,如(仅使用内置的logback):
logging.pattern.console=%level %date{HH:mm:ss} %logger{20}.%M %L :%m%n
logging.pattern.file= %level %date{ISO8601} [%thread} %logger{20}. %M %L :%m%n
- %level,日志输出级别
- %date,日志发生时的时间,ISO8601则是标准日期输出格式
- %logger,用于输出Logger的名字,包名+类名,{n}限定长度。
- %thread,当前线程名
- %M,日志发生时的方法名字;
- %L,日志调用所在的代码行。
- %m,日志消息
- %n,日志换行
通过参数–debug将系统日志级别调整为debug方式。
java -jar app.jar --debug
三、读取应用配置
可以在应用中读取application.properties文件,Spring Boot提供了三种方式,通用的Environment,可以通过key-value方式获取到其中的值,也可通过@Value注解,自动注入属性值,还可将一组属性自动注入到一个配置类中。
3.1 Environment
Environment是一个通用的读取应用程序运行时的环境变量的类,可以读取application.properties、命令行输入参数、系统属性、操作系统环境变量等。可以通过Spring容器自动注入,比如在Spring管理的Bean中:
@Configuration
public class EvnConfig {
@Autowried private Environment env;
public int getServerPort(){
return env.getProperty("server.port",Inter\ger.class);
}
}
读取的例子:
读取 | 返回值 |
---|---|
env.getProperty(“user.dir”) | 程序运行的目录 |
env.getProperty(“user.home”) | 执行程序的用户的home目录 |
env.getProperty(“JAVA_HOME”) | 读取环境的环境变量 |
3.2 @Value
直接通过@Value注解注入一个配置信息到Spring管理的Bean中:
@RequestMapping("/showvalue.html")
public @ResponseBody String value(@Value("${server.port}") int port{
return "port:"+port;
}
3.3 @ConfigurationProperties
通常情况下,将一组同样类型的配置属性映射为一个类更为方便,比如服务器配置,在application.properties中写成如下配置:
server.port=9090
server.context-path=/config
以上三个配置属性都与Web服务器配置相关,都有server前缀,因此可以使用@ConfigurationProperties来获取这一组实现,如:
@ConfigurationProperties
@Configuration
public class ServerConfig{
private int port;
private String contextPath;
public int getPort() {
return port;
}
public void serPort(int port){
this.port=port;
}
//contextPath同理;
}
在处理ConfigurationProperties注解的类的时候,自动会将“-”或者“_”去掉,转化为Java命名规范。
LibraryProperties 类上加了 @Component 注解,我们可以像使用普通 bean 一样将其注入到类中使用。
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "library")
@Setter
@Getter
@ToString
class LibraryProperties {
private String location;
private List<Book> books;
@Setter
@Getter
@ToString
static class Book {
String name;
String description;
}
这个时候你就可以像使用普通 bean 一样,将其注入到类中使用:
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author shuang.kou
*/
@SpringBootApplication
public class ReadConfigPropertiesApplication implements InitializingBean {
private final LibraryProperties library;
public ReadConfigPropertiesApplication(LibraryProperties library) {
this.library = library;
}
public static void main(String[] args) {
SpringApplication.run(ReadConfigPropertiesApplication.class, args);
}
@Override
public void afterPropertiesSet() {
System.out.println(library.getLocation());
System.out.println(library.getBooks()); }
}
3.3.1 通过@ConfigurationProperties读取并校验
将application.yml修改为如下内容,明显看出这不是一个正确的 email 格式:
my-profile:
name: Guide哥
email: koushuangbwcx@
ProfileProperties 类没有加 @Component 注解。我们在我们要使用ProfileProperties 的地方使用@EnableConfigurationProperties注册我们的配置 bean:
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
@Getter
@Setter
@ToString
@ConfigurationProperties("my-profile")
@Validated
public class ProfileProperties {
@NotEmpty
private String name;
@Email
@NotEmpty
private String email;
//配置文件中没有读取到的话就用默认值
private Boolean handsome = Boolean.TRUE;
}
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(ProfileProperties.class)
public class ReadConfigPropertiesApplication implements InitializingBean {
private final ProfileProperties profileProperties;
public ReadConfigPropertiesApplication(ProfileProperties profileProperties) {
this.profileProperties = profileProperties;
}
public static void main(String[] args) {
SpringApplication.run(ReadConfigPropertiesApplication.class, args);
}
@Override
public void afterPropertiesSet() {
System.out.println(profileProperties.toString());
}
}
因为我们的邮箱格式不正确,所以程序运行的时候就报错,根本运行不起来,保证了数据类型的安全性:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-profile' to cn.javaguide.readconfigproperties.ProfileProperties failed:
Property: my-profile.email
Value: koushuangbwcx@
Origin: class path resource [application.yml]:5:10
Reason: must be a well-formed email address
我们把邮箱测试改为正确的之后再运行,控制台就能成功打印出读取到的信息:
ProfileProperties(name=Guide哥, email=koushuangbwcx@163.com, handsome=true)
3.4 @PropertySource读取指定 properties 文件
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:website.properties")
@Getter
@Setter
class WebSite {
@Value("${url}")
private String url;
}
使用:
@Autowired
private WebSite webSite;
System.out.println(webSite.getUrl());//https://javaguide.cn/
四、Spring Boot自动装配
Spring 提供了Java配置的核心就是使用@Configuration作用在类上,并且联合在此类上多个@Bean注解的方法,声明Spring管理的Bean。
@Configuration
public class Configuration {
@Bean("bean")
public Bean getBean(){
return new Bean();
}
}
可以在@Bean注解的方法上提供任意参数来说明依赖,比如Service需要依赖数据源datasource:
@Bean
public Service getService(DataSource datasource){
return new Service (datasource);
}
在配置好Bean后,可以通过@Autowired在任何地方自动注入。
@Service
public class Service{
@Autowired Service service;
}
4.1 Bean条件装配
4.2 Class条件装配
4.3 Environment装配
4.4 其他条件装配
4.5 联合多个条件
五、配置文件加载位置和顺序
springboot启动会扫描一下位置的配置文件作为springboot的默认配置文件。
- 项目路径下的config文件夹
- 项目路径下
- classpath路径下config文件夹
- classpath路径下
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。如果不冲突,形成互补配置。
我们也可以通过配置spring.config.location来改变默认配置。使用命令行方式加载,否则优先级不够。
Copyjava –jar xxxx.jar –spring.config.location=配置文件路径
六、外部配置加载顺序
SpringBoot也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。
- 命令行参数
- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性
七、加载外部配置文件
对配置中的内容进行拆分,拆分到多个文件中。这样就提高了配置的可维护性。
引入外部配置文件:
- @PropertySource(value={“classpath:student.properties”})
- @ImportResource(locations={“classpath:spring.xml”}
- @Configuration和@Bean方式。(SpringBoot推荐方式)
第一种方式:@ProperSource方式:需要注入的类的前面使用该注解。
第二种方式:@ImportResource方式首先添加一个spring的配置文件,在里面添加需要映射的类。在启动的SpringBootApplication前面使用该注解
第三种方式:@Configuration和@Bean方式添加一个自定义配置类。
Copy//第三种方式
@Configuration
public class MyConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public MySQLInfo mySQLInfo(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new MySQLInfo();
}
}
八、切换多个外部配置文件
比如现在我们有三个配置文件:
- application.yml
- application-dev.yml
- application-prod.yml
Spring Boot配置,读取配置文件的更多相关文章
- Spring Boot 2 读取配置文件
开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 新建一个名称为demo的Spring Boot项目. 一.默认配置文件 Spring Boot会读取名称a ...
- 【转】spring boot mybatis 读取配置文件
spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...
- spring boot中读取配置文件的两种方式
application.properties test.name=测试 test.url=www.test.com 1.@Value注解 在controller里可以这样直接调用 @Value(&qu ...
- spring boot 项目从配置文件中读取maven 的pom.xml 文件标签的内容。
需求: 将pom.xml 文件中的版本号读取到配置文件并打印到日志中. 第一步: 在pom.xml 中添加以下标签. 第二步: 将version 标签的值读取到配置文件中 这里使用 @@ 而不是 ...
- Spring Boot -- 配置切换指南
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- Spring Boot 配置优先级顺序
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- 笔记:Spring Boot 配置详解
Spring Boot 针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板配置内容,但是,我们还是需要了解如何在Spring Boot中修改这些自动化的配置,以应对一些特殊场 ...
- Spring Boot - 配置介绍
Spring Boot 针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板配置内容,但是,我们还是需要了解如何在Spring Boot中修改这些自动化的配置,以应对一些特殊场 ...
- Spring Boot 配置详解
Spring Boot 针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板配置内容,但是,我们还是需要了解如何在Spring Boot中修改这些自动化的配置,以应对一些特殊场 ...
随机推荐
- Atcoder abc187 F Close Group(动态规划)
Atcoder abc187 F Close Group 题目 给出一张n个点,m条边的无向图,问删除任意数量的边后,留下来的最少数量的团的个数(\(n \le 18\) ) 题解 核心:枚举状态+动 ...
- Node 跨域问题 Access to XMLHttpRequest at 'http://localhost:8080/api/user/login' from origin 'http://localhost:808
人不可能踏进同一条河流,我可以一天在同一个问题上摔倒两次. 这次是跨域问题,都是泪,教程提供的服务端代码虽然配置了文件,但是依然是没有解决跨域问题,依然报错 Request header field ...
- JavaScript AMD模块化规范
浏览器环境 有了服务器端模块以后,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行. 但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器 ...
- 软件“美不美”,UI测试一下就知道
摘要:软件测试的最高层次需求是:UI测试,也就是这个软件"长得好不好看". 为了让读者更好地理解测试,我们从最基础的概念开始介绍.以一个软件的"轮回"为例,下图 ...
- redis数据类型:String
redis数据类型:String 花开堪折直需折,莫待无花空折枝 实际应用中有多种多样的场景,比如: 秒杀 新闻热点 在线人数 session.token管理 各个场景需要的数据类型各不相同:常见的数 ...
- NOIP初赛篇——05计算机语言
程序 程序就是一系列的操作步骤,计算机程序就是由人实现规定的计算机完成某项工作的操作步骤.每一步骤的具体内容能够理解的指令来描述,这些指令告诉计算机"做什么"和"怎么 ...
- 初学java进制转换方面补充学习
进制转换: 基础: 二进制用的数为:0/1 八进制用的数为:0/1/2/3/4/5/6/7 十进制用的数为:0/1/2/3/4/5/6/7/8/9 十六进制用的数为:0/1/2/3/4 ...
- MybatisPlus多数据源及事务解决思路
关于多数据源解决方案 目前在SpringBoot框架基础上多数据源的解决方案大多手动创建多个DataSource,后续方案有三: 继承org.springframework.jdbc.datasour ...
- 【linux】系统编程-7-网络编程
目录 前言 10. 网络编程 10.1 简要网络知识 10.2 IP协议 10.2.1 IP地址编址 10.2.2 特殊IP地址 10.2.1 首限广播地址 10.2.2 直接广播地址 10.2.3 ...
- PyTorch 于 JupyterLab 的环境准备
PyTorch 是目前主流的深度学习框架之一,而 JupyterLab 是基于 Web 的交互式笔记本环境.于 JupyterLab 我们可以边记笔记的同时.边执行 PyTorch 代码,便于自己学习 ...