补习系列(10)-springboot 之配置读取

目录

  • 简介
  • 一、配置样例
  • 二、如何注入配置
    • 1. 缺省配置文件
    • 2. 使用注解
    • 3. 启动参数
    • 还有..
  • 三、如何读取配置
    • @Value 注解
    • Environment 接口
    • @ConfigurationProperties 注解
  • 四、不同环境中的配置
    • 1. 区别开发、测试、发布环境
    • 2. 声明多配置文件
  • 参考文档

简介

在早前的博客中曾经写过 Spring 程序通过 Bean 映射实现配置信息的读取。
在SpringBoot 框架中读取配置的方式变得非常多样,这导致读者在搜寻资料时反而容易迷糊。

  • 到底,SpringBoot 是按什么顺序加载配置?
  • 相应的,我们该选择什么样的方式去读取?

一、配置样例

先看一个例子:

@Compoment
public class BuildConfig{

   @Value("${buildinfo.version")
   private String version;

  ...
}

代码中,@Component 将 BuildConfig 注册为 Bean ,
接下来使用 @Value 注解,将 配置中的 buildinfo.version键映射到了 version 字段上。

我们都知道,通过 application.properties 可以方便的配置一些属性。
属性的值是支持变量替换的,如下:

myName=Lilei
myDesc=${myName} is a good man 

这点,是由 SpringBoot 自动生成的 PropertyPlaceholderConfigurer 对象实现的。

除了 上面所说 application.properties 之外,还有什么途径?
下面介绍如何注入配置

二、如何注入配置

1. 缺省配置文件

类路径中 application.properties(yml) 是默认的配置文件。
此外如果启动应用时,当前目录中存在同名的配置文件,则以此优先。

在此规则之下,SpringBoot 还能识别不同 profile下的配置,这将在后面篇幅中介绍。

2. 使用注解

@PropertySource

可指定属性配置文件的位置,
样例代码:

@Configuration

@PropertySource("classpath:/com/myco/app.properties")

public class AppConfig {

     @Autowired

     Environment env;

     @Bean

     public TestBean testBean() {

         TestBean testBean = new TestBean();

         testBean.setName(env.getProperty("testbean.name"));

         return testBean;

     }

}

@TestPropertySource

与 @PropertySource 类似,该注解用于指定测试环境中的属性文件,其优先级高于 @PropertySource。

3. 启动参数

以下的命令以指定参数启动 SpringBoot 应用

java -jar application.jar --server.port=9000

server.port 值将被注入为环境属性值。

而以下的命令还可以指定 配置文件的位置

java -jar application.jar --spring.config.location=/etc/xxx.properties

这个spring.config.location就是指的配置文件位置,
默认情况下,SpringBoot 会从下面几路径找到配置文件:

路径
file:./config/
file:./
classpath:/config/
classpath:/

还有..

SpringBoot 注入配置的方式其实非常多,完整顺序如下表:

优先级 配置
1 @TestPropertySource 注解
2 @SpringBootTest 注解
3 命令行参数
4 SPRING_APPLICATION_JSON 属性值(或环境变量)
5 Servlet 相关参数
6 JNDI 属性
7 Java 系统属性 (System.getProperties())
8 操作系统环境变量
9 RandomValuePropertySource 随机属性
10 Jar包外部 application-{profile}.properties
11 Jar包内部 application-{profile}.properties
12 Jar包外部 application.properties
13 Jar包内部 application.properties
14 @PropertySource 注解
15 SpringApplication 默认值

三、如何读取配置

@Value 注解

如以下的实现:

@Configuration
public class AppConfig {

    @Value("${api.log.enabled:false}")
    private boolean apiLogEnabled;

除了类型自动转换之外,通过:false后缀可以指定默认值。

Environment 接口

Environment 是一个类似 Properties 的接口,用来获取属性非常方便。

@Configuration
public class AppConfig {

    @Autowired
    private Environment environment;

    public String getApplicationId() {
        return this.environment.getProperty("application.id");
    }
}

@ConfigurationProperties 注解

该注解一般用作前缀匹配,下面的代码摘自Mongodb

@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {

 /**
  * Mongo server host.
  */
 private String host;

 /**
  * Mongo server port.
  */
 private Integer port = null;

 /**
  * Database name.
  */
 private String database;

相应的 Mongodb 配置信息如:

spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=xxx

四、不同环境中的配置

Spring 提供了 Profile 机制用于管理不同环境的配置。

配置内容可以是 Java Config(对应@Component或@Configuration),也可以是配置文件。
如:

@Configuration
@Profile("prod")
public class ProdConfiguration {

 // ...

}

通过@Profile注解可将代码配置关联到某个配置环境

在具体应用中,Profile的用途通常有二:

1. 区别开发、测试、发布环境

对于dev、prod、test分别做不同的配置

//for dev
application-dev.properties

//for prod
application-prod.properties

//for test
application-test.properties

可以在 application.properties 指定启用的环境:

spring.profiles.active=dev

也可以通过命令行指定:

java -jar app.jar --spring.profiles.active=prod

2. 声明多配置文件

当内容过多时,可以将配置信息进行拆分,如下:

application-mongodb.properties

spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.username=xxx
spring.data.mongodb.password=xxx
spring.data.mongodb.database=xxx

application-mail.properties

spring.mail.host=xxx
spring.mail.username=xxx
spring.mail.password=xxx

spring.mail.from=xxx
spring.mail.to=xxx
spring.mail.cc=xxx

在主配置文件指定包含关系:

application.properties

spring.profiles.include=mongodb,mail

参考文档

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

欢迎继续关注"美码师的补习系列-springboot篇" ,如果觉得老司机的文章还不赖,请多多分享转发^-^

原文地址:https://www.cnblogs.com/littleatp/p/9703855.html

时间: 2024-08-04 11:49:43

补习系列(10)-springboot 之配置读取的相关文章

补习系列(15)-springboot 分布式会话原理

目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope 一文中,笔者介绍过 Session的部分,如下: 对于服务器而言,Session 通常是存储在本地的,比如Tomcat 默认将Session 存储在内存(ConcurrentHashMap)中. 但随着网站的用户越来越多,Session所需的空间会越来越大,同时单机部署的 Web应用会出现性能瓶颈

补习系列(9)-springboot 定时器,你用对了吗

目录 简介 一.应用启动任务 二.JDK 自带调度线程池 三.@Scheduled 定制 @Scheduled 线程池 四.@Async 定制 @Async 线程池 小结 简介 大多数的应用程序都离不开定时器,通常在程序启动时.运行期间会需要执行一些特殊的处理任务. 比如资源初始化.数据统计等等,SpringBoot 作为一个灵活的框架,有许多方式可以实现定时器或异步任务. 我总结了下,大致有以下几种: 使用 JDK 的 TimerTask 使用 JDK 自带调度线程池 使用 Quartz 调度

补习系列(21)-SpringBoot初始化之7招式

目录 背景 1. @PostConstruct 注解 2. InitializingBean 接口 3. @Bean initMethod方法 4. 构造器注入 5. ApplicationListener 6. CommandLineRunner 7. ApplicationRunner 测试代码 参考文档 背景 在日常开发时,我们常常需要 在SpringBoot 应用启动时执行某一段逻辑,如下面的场景: 获取一些当前环境的配置或变量 向数据库写入一些初始数据 连接某些第三方系统,确认对方可以

补习系列(1)-springboot项目基础搭建课

[TOC] 前言 springboot 最近火的不行,目前几乎已经是 spring 家族最耀眼的项目了.抛开微服务.技术社区这些推广因素不说,框架本身的确有非常多的优点.比如 更简化的配置,摒除了许多繁杂的xml配置(事实证明,越简单的东西越容易让人记住): 内置Servlet容器,不再依赖外部环境 大量的starter模块,随手拈来 支持热部署 作为一名老程序员来说,仍然需要保持一个积极学习的态度.哎,简单点说就是少点伤感,认清现实.你曾经引以为傲的某某EE 技术已经被颠覆了,赶紧换车道 ..

补习系列-springboot 实现拦截的五种姿势

目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@ExceptionHandler 注解 姿势四.RequestBodyAdvice/ResponseBodyAdvice RequestBodyAdvice 的用法 ResponseBodyAdvice 用法 姿势五.@Aspect 注解 思考 小结 简介 AOP(面向切面编程)常用于解决系统中的一些耦合

补习系列-springboot 单元测试之道

目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 springboot 实现接口的测试 了解如何 利用 mokito 做代码的 mock 一.About 单元测试 单元测试其实是一种廉价的技术,是由开发者创建运行测试代码,用于对程序模块(软件设计的最小单位)进行正确性检验的一种做法. 而所谓的最小单元,就是指应用的最小可测试部件. 在面向对象领域,最小单

Windows Server 2012 R2 VDI系列(五)—配置RDSH角色

下边我们来看一下如何配置RDSH角色,RDSH因为我们需要发布应用程序以及虚拟桌面,因此我们这里需要两台RDSH服务器 1.点击添加角色和功能 2.这里直接下一步 3.选择远程桌面服务安装 4.因为之前已经配置好了RDCB,这里会直接将RDCB服务器读取出来,我们直接下一步 5.之前我们已经完成了RDVH的配置,这里我们选择基于会话的桌面部署 6.直接下一步 7.这里直接下一步 8.这里直接下一步 9.这里我们将RDSH1和RDSH2两台服务器加入到右边,然后下一步 10.勾选需要时自动重启目标

如何编写Spring-Boot自动配置

摘要 本文主要介绍如何把一个spring的项目(特别是一些公共工具类项目),基于spring boot的自动配置的思想封装起来,使其他Spring-Boot项目引入后能够进行快速配置. AutoConfiguration Spring-boot的一个重要特性就是提供了各种各样的AutoConfiguration.例如DataSourceAutoConfiguration.这样我们只需要在配置文件中进行如下配置 spring: datasource: url: jdbc:mysql://xxxxx

补习系列-springboot-restful应用

一.目标 了解 Restful 是什么,基本概念及风格: 能使用SpringBoot 实现一套基础的 Restful 风格接口: 利用Swagger 生成清晰的接口文档. 二.Restful 入门 什么是REST 摘自百科的定义:REST即表述性状态转移(英文:Representational State Transfer,简称REST) 是Roy Fielding博士(HTTP规范主要贡献者)在2000年的论文中提出来的一种软件架构风格. 是一种针对网络应用的设计和开发方式,可以降低开发的复杂