SpringBoot项目有一些基本的配置,比如启动图案(banner),比如默认配置文件application.properties,以及相关的默认配置项。

示例项目代码在:https://github.com/laolunsi/spring-boot-examples


一、启动图案banner

编写banner.txt放入resources文件夹下,然后启动项目即可修改默认图案。

关于banner的生成,可以去一些专门的网站。

比如:https://www.bootschool.net/ascii


二、配置文件application

2.1 application.properties/yml

resources下通常会默认生成一个application.properties文件,这个文件包含了SpringBoot项目的全局配置文件。里面的配置项通常是这样的:

server.port=8080

在这个文件里我们可以添加框架支持的配置项,比如项目端口号、JDBC连接的数据源、日志级别等等。

现在比较流行的是将properties文件改为yml文件。yml文件的格式yaml是这样的:

server:
port: 8080

yml和properties的作用是一样的。而yml的好处是显而易见的——更易写易读。

属性之间互相调用使用${name}:

eknown:
email: eknown@163.com
uri: http://www.eknown.cn
title: 'hello, link to ${eknown.uri} or email to ${eknown.email}'

链接:SpringBoot所有官方配置属性


2.2 多环境配置文件

通常开发一个应用会有多个环境,常见如dev/prod,也会有test,甚至其他一些自定义的环境,SpringBoot支持配置文件的灵活切换。

定义新配置文件需要遵循以下格式:application-{profile}.properties 或者application-{profile}.yml

比如现在有dev和prod两个环境,我需要在application.yml文件之外新建两个文件:

  1. application-dev.yml

    server:
    port: 8080
  2. application-prod.yml

    server:
    port: 8081

然后在application.yml中通过application.profiles.active={profile}指明启用那个配置:

application:
profiles:
active: dev

除了在application.yml中指定配置文件外,还可以通过启动命令指定:java -jar xxx.jar --spring.profiles.active=dev


2.2 自定义配置项并获取它

主要介绍两种方式,获取单个配置项和获取多个配置项。

举例:

eknown:
email: eknown@163.com
uri: http://www.eknown.cn

2.2.1 使用@Value注解获取单个配置项

@Value("${eknown.email}")
private String email; @Value("${eknown.uri}")
private String url;

注意:使用@Value注解的时候,所在类必须被Spring容器管理,也就是被@Component、@Controller、@Service等注解定义的类。

2.2.2 获取多个配置项

第一种,定义一个bean类,通过@Value获取多个配置项:

@Component
public class MyConfigBean { }

然后我们通过get方法来获取这些值:

@RestController
public class BasicAction { @Autowired
private MyConfigBean myConfigBean; }

第二种,使用注解@ConfigurationProperties:

@Component
@ConfigurationProperties(perfix="eknown")
public class MyConfigBean { private String email;
private String uri;
}

这里只需要通过prefix指定前缀即可,后面的值自动匹配。

这里我们还使用了@Component注解来让spring容器管理这个MyConfigBean。

此外,我们可以不需要引入@Component,转而在Application启动类上加上@EnableConfigurationProperties({MyConfigBean.class})来启动这个配置。

注意:我们这里是从主配置文件,也就是SpringBoot默认的application-profile文件中获取配置数据的。

而从自定义的配置文件,比如test.yml这种形式中获取配置项时,情况是有点不大一样的。


三、自定义配置文件

上面介绍的配置文件都是springboot默认的application开头的文件。如果要自定义一个配置文件呢,比如test.yml或test.properties,怎么获取其中的配置项呢?

使用@PageResource注解即可。

首先我们来看一下读取自定义的properties文件里的内容:

test.properties

hello.time=2019.11.19
hello.name=eknown

定义Configuration类:

@Configuration
@PropertySource("classpath:test.properties")
//@PropertySource("classpath:test.yml") // 注意,yml文件不能直接这样写,会读不出数据
@ConfigurationProperties(prefix = "hello")
public class TestConfiguration {
private String name;
private String time; // hide get and set methods
}

测试一下:

@RestController
@RequestMapping(value = "test")
public class TestAction { @Autowired
private TestConfiguration testConfiguration; @GetMapping(value = "config")
public String test() {
return testConfiguration.getName() + "<br/>" + testConfiguration.getTime();
}
}


如果将properties文件换成yml文件呢?

我们尝试一下,发现:

读不出数据?

分析一下@PropertySource注解,发现其使用的PropertySourceFactory是DefaultPropertySourceFactory.

这个类的源码如下:

public class DefaultPropertySourceFactory implements PropertySourceFactory {
public DefaultPropertySourceFactory() {
} public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);
}
}

这个类只能处理properties文件,无法处理yml文件。所以我们需要自定义一个YmlSourceFactory。

public class YamlSourceFactory extends DefaultPropertySourceFactory {

    @Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
return new YamlPropertySourceLoader().load(resource.getResource().getFilename()
, resource.getResource()).get(0);
}
}

然后定义test.yml文件的config类:

@Configuration
@PropertySource(value = "classpath:test.yml", encoding = "utf-8", factory = YamlSourceFactory.class)
@ConfigurationProperties(prefix = "yml.hello")
public class TestYamlConfiguration {
private String name;
private String time; // hide get and set methods
}

注:为了区分test.properties和test.yml,这里的test.yml中的属性以yml.hello开头。

编写一下测试:

    @Autowired
private TestYamlConfiguration ymlConfiguration; @GetMapping(value = "yml")
public String testYml() {
return "yml config: <br/>" + ymlConfiguration.getName() + "<br/>" + ymlConfiguration.getTime();
}

访问:


四、补充@ConfigurationProperties

网上一些资料中,为配合使用@ConfigurationProperties,还使用了@EnableConfigurationProperties注解。

经过测试发现:

  1. 从SpringBoot默认配置文件读取配置信息,使用@ConfigurationProperties + @Component/@Configuration,或者@ConfigurationProperties + 在启动类添加@EnableConfigurationProperties({class})。这两种方式都能解决问题

  2. 从非默认配置文件读取配置信息,需要利用@PropertySource注解。同样两种方式:

    2.1 @PropertySource + @ConfigurationProperties + @Component/@Configuration

    2.2 @PropertySource + @ConfigurationProperties + @Component/@Configuration + @EnableConfigurationProperties,第二种方式存在一个问题,即还是必须要使用@Component注解,如果不使用,则会导致读取配置信息为null,但程序不会报错;而如果采用了,则会导致bean类的set方法被执行两次(也就是生成了两个同样类型的bean类)。这种方式不建议!

SpringBoot基本配置详解的更多相关文章

  1. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  2. springboot配置详解

    springboot配置详解 Author:SimpleWu properteis文件属性参考大全 springboot默认加载配置 SpringBoot使用两种全局的配置文件,全局配置文件可以对一些 ...

  3. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  4. SpringBoot—整合log4j2入门和log4j2.xml配置详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维.而日志的输出需要有一定的规划,如日志命名.日志大小,日志分 ...

  5. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  6. Spring全家桶——SpringBoot之AOP详解

    Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...

  7. Springboot mini - Solon详解(二)- Solon的核心

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  8. Springboot mini - Solon详解(三)- Solon的web开发

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  9. Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

随机推荐

  1. docker配置阿里云镜像

    今天docker pull镜像的时候太慢了  所以这里配置下阿里云镜像 打开阿里云控制台,没有的可以用淘宝账号或者支付宝账号直接登录 打开容器镜像服务,镜像加速器,复制加速器地址 修改配置文件 $: ...

  2. [NOIp2011] luogu P1314 聪明的质监员

    题目描述 点进去看吧,说的不能再清楚了. Solution 看到数据规模不难想到二分 WWW,然后用个前缀和优化一下即可.注意上下界. #include<cstdio> #include& ...

  3. 可实现的全局唯一有序ID生成策略

    在博客园搜素全局唯一有序ID,罗列出来的文章大致讲述了以下几个问题,常见的生成全局唯一id的常见方法 :使用数据库自动增长序列实现 : 使用UUID实现:  使用redis实现: 使用Twitter的 ...

  4. php在哪里写代码?

    php在哪里写代码? php可以在PhpStorm中写代码. PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码 ...

  5. python-json与字典的区别

    1.字典的类型是字典dict,是一种数据结构:json的类型是字符串str,json是一种格式: 接口测试是传参数payload时有时候是传的字符串,应该将payload的类型改为json  这点要注 ...

  6. 11.Nginx架构进阶

    1.如何将LNMP拆分为LNP+MySQL 1.备份172.16.1.7上的数据库信息 [root@web01 ~]# mysqldump -uroot -p'000000' --all-databa ...

  7. jquery mutilselect 插件添加中英文自动补全

    jquery mutilselect默认只能根据设置的option来进行自动提示 $.each(availableTags, function(key, value) { $('#channels') ...

  8. Centos7 安装redis 并新建springboot工程使用Redis 做session

    Redis 安装 就是解压运行,根据自己的爱好,放到文件夹中 tar -zxvf redis-5.0.4.tar.gz yum install gcc cd redis-5.0.4 make MALL ...

  9. jquery获取dom属性方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Vue---mock.js 使用

    mockjs 概述 在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数 ...