您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Spring boot 配置类与配置文件详解

时间:2019-10-08 10:28:12  来源:  作者:
Spring boot 配置类与配置文件详解

 

前言

在现今Spring boot 流行年代,相信大部人都非常喜欢Spring boot简洁而非常有效的配置,让我们从庞大xml配置解放出来,让每个框架都需要手动配置集成的劳动中解放出来。这一切都是spring Boot基于约定优于配置的思想,大量的减少了配置文件的使用。

@SpringBootApplication注解

一个简单的@SpringBootApplication注解可以试下这那三个功能:

  • @EnableAutoConfiguration: 启动Spring boot 的自动化配置机制
  • @ComponentScan : 在程序所在的包下面启用组件扫描
  • @Configuration: 允许在上下文中注册额外的bean或导入其他配置类

Spring boot的配置类

Spring boot 偏好于基于JAVA类的配置,尽管SpringApplication也可以和XML配置一起使用,但是Spring boot建议我们的配置写在单个 @Configuration 注解的类中,通常,Spring boot 官方声称定义主方法的类作为主@configuration是一个很好的选择。但我们也可以根据我们的业务需要写多个@configuration,比如说 数据库连接配置一个 @configuration,线程池配置一个 @configuration等等

导入配置类

我们不需要将所有@configuration放到一个类中。@import注解可用于导入其他配置类。或者,您可以使用@components can自动扫描所有Spring组件,包括@configuration类。

@SpringBootApplication
@Import({LinkConfig.class, ConnectionPoolConfig.class, HttpConfig.class, CuratorConfig.class, GlobalConfig.class})
public class ExampleController 

导入xml配置

如果你一定要使用基于xml的配置,建议仍然从@configuration类开始。然后可以使用@ImportResource注解加载XML配置文件

SpringBootApplication
@ImportResource("classpath:*.xml")
public class ExampleController 

自动配置

Spring Boot自动配置功能会尝试根据你添加的JAR依赖项自动配置您的Spring应用程序。例如,如果hsqldb在你的类路径上,并且你没有手动配置任何数据库连接bean,那么spring boot会自动为你配置一个内存数据库。

你只需要选择自动配置,方法是将@EnableAutoconfiguration或@SpringBootApplication注释添加到您的@configuration类中。

注意:你应该只添加一个@SpringBootApplication或@EnableAutoconfiguration注解。我们通常建议您只向主要@configuration类添加一个注解(主要configuration 是带main方法的启动类)

自动化配置是非侵入式的,在任何一个点上,你可以定义你自己的配置去替换 auto-configuration 引入的配置。例如,你添加了自己的数据源配置,则auto-configuration 带进来的数据配置将会无效。

禁用部分自动配置类

如果你发现一些不想应用的特定自动配置类,可以使用@EnableAutoconfiguration的exclude属性禁用它们,如下例所示:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ExampleController 

Spring boot 的配置文件

Spring boot允许将配置外部化,以便应用程序代码在不同的环境中使用不同的配置。可以使用properties文件、yaml文件、环境变量和命令行参数来外部化配置。属性值可以通过使用@value注解直接注入bean,通过Spring的环境抽象访问,或者通过@ConfigurationProperties绑定到结构化对象。

Spring Boot使用一个非常特殊的属性源顺序,这样设计是为了个这些配置一个优先级,以便于进行的合理覆盖。属性按以下顺序:

  1. 主目录上的devtools全局设置属性(~/.spring-boot-devtools.properties,当devtools处于活动状态时)
  2. @TestPropertySource 注解在你的测试代码上
  3. @SpringBootTest 注解上的属性值在测试代码上,测试应用程序特殊部分的测试注解
  4. 命令行参数
  5. 来自于SPRING_APPLICATION_JSON 的参数属性值,(嵌入在环境变量或系统属性中的内联JSON)
  6. ServletConfig 初始化的参数
  7. ServletContext 初始化参数
  8. 来自 java:comp/env 的JNDI 属性值
  9. Java System 的属性(System.getProperties())
  10. 系统环境变量
  11. 仅在RandomValuePropertySource*中具有属性的RandomValuePropertySource。
  12. 在打包的JAR之外配置特定的Profile-specific.properties(application-{profile}.properties 和yaml 文件)
  13. 在打包的JAR里面配置特定的Profile-specific.properties(application-{profile}.properties 或yaml 文件)
  14. 在打包的JAR之外的 application.properties或yaml 文件
  15. 在打包的JAR里面的 application properties(application.properties 或yaml 文件)
  16. @PropertySource注解在你的 @Configuration 配置类上
  17. 默认属性(通过设置SpringApplication.setDefaultProperties指定)

下面举个例子,假如你开发了一个使用name属性的@component,如下例所示:

@Component
 public class ComBean {
 @Value("${name}")
 private String name;
 }

在应用程序classpath路径(例如,在JAR中)上,可以有一个application.properties文件,该文件为name提供了一个合理的默认属性值。在新环境中运行时,可以在jar外部提供application.properties文件来覆盖name 属性。对于一次性测试,您可以使用特定的命令行开关(例如java –jar app.jar --name=”String”)启动。

在前面的示例中,您将在Spring环境中得到name=test。您还可以在系统属性中以spring.application.json的形式提供json,如下例所示:

java -Dspring.application.json='{"name":"test"}' -jar myapp.jar

还可以使用命令行参数提供JSON,如下例所示:

java -jar myapp.jar --spring.application.json='{"name":"test"}'

RandomValuePropertySource配置随机数

RandomValuePropertySource对于生产注入随机值(例如,到机密或测试用例中)很有用。它可以生成整数、long、uuid或字符串,如下例所示:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]} 

访问命令行参数

默认情况下,SpringApplication会将任何命令行选项参数(即以-开头的参数,例如--server.port=9000)转换为属性,并将其添加到Spring环境中。如前所述,命令行属性总是优先于其他属性源。

如果不希望将命令行属性添加到环境中,可以使用

SpringApplication.setAddCommandLineProperties(false)

Application 属性文件

SpringApplication从以下位置的application.properties文件加载属性,并将其添加到Spring环境中:

  1. 当前目录的 /config 子目录
  2. 当前目录
  3. classpath 的 /config 包
  4. classpath 的根目录

3 和 4 是实际项目应用比较常见

列表按优先级排序(在列表中较高位置定义的属性覆盖在较低位置定义的属性)。

如果不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性切换到另一个文件名。还可以使用spring.config.location环境属性(目录位置或文件路径的逗号分隔列表)引用显式位置。以下示例显示如何指定其他文件名:

java -jar myproject.jar --spring.config.name=myproject

以下示例显示如何指定两个位置:

java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

如果spring.config.location包含目录(与文件相反),那么它们应该以/结尾,并且在运行时,在加载之前,附加从spring.config.name生成的名称,包括特定文件的文件名)。spring.config.location中指定的文件按原样使用,不支持特定于概要文件的变量,并且被任何特定于概要文件的属性覆盖。

按相反的顺序搜索配置位置。默认情况下,配置的位置为classpath/、classpath:/config/、file:../、file:../config/。结果搜索顺序如下:

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

当使用spring.config.location配置自定义配置位置时,它们将替换默认位置。例如,如果spring.config.location配置了值classpath:/custom config/,file:/custom config/,则搜索顺序如下:

  1. file:./custom-config/
  2. classpath:custom-config/

或者,当使用spring.config.additional-location配置自定义配置位置时,除了默认位置外,还将使用这些位置。在默认位置之前搜索其他位置。例如,如果配置了classpath:/custom config/,file:/custom config/的其他位置,则搜索顺序如下:

  1. file:./custom-config/
  2. classpath:custom-config/
  3. file:./config/
  4. file:./
  5. classpath:/config/
  6. classpath:/

此搜索顺序允许您在一个配置文件中指定默认值,然后有选择地在另一个配置文件中覆盖这些值。您可以在默认位置的application.properties(或用spring.config.name选择的任何其他基名称)中为应用程序提供默认值。然后,可以在运行时使用位于其中一个自定义位置的其他文件覆盖这些默认值。

Profile-specific Properties

除了application.properties文件外,还可以使用以下命名约定定义特定于文件的属性:application-{profile}.properties。环境有一组默认配置文件(默认情况下为[default]),如果未设置活动配置文件,则使用这些默认配置文件。换句话说,如果没有显式激活配置文件,那么将加载application-default.properties中的属性。

配置文件特定的属性从与标准application.properties相同的位置加载,配置文件总是覆盖非特定的文件,无论配置文件是在打包的jar内还是在打包的jar外。

如果指定了多个配置文件,则应用最后一个胜利策略。例如,spring.profiles.active属性指定的配置文件将添加到通过SpringApplication API配置的配置文件之后,因此优先。

如果在spring.config.location中指定了任何文件,则不会考虑这些文件的特定于概要文件的变体。如果还想使用特定于概要文件的属性,请使用spring.config.location中的目录。

属性中的占位符

application.properties中的值在使用时通过现有环境进行过滤,因此您可以引用以前定义的值(例如,从系统属性)

app.name=MyApp
app.description=${app.name} is a Spring Boot application

Profiles

Spring配置文件提供了一种隔离应用程序配置部分的方法,使其仅在特定环境中可用。任何@component或@configuration在加载时都可以用@profile进行标记以限制,如下例所示:

@Configuration
@Profile("production")
public class ProductionConfiguration {
 // ...
}

可以使用spring.profiles.active 环境属性指定哪些配置文件处于活动状态。例如,您可以将其包含在application.properties中,如下例所示:

spring.profiles.active=dev,hsqldb

您还可以使用以下开关在命令行上指定它:--spring.profiles.active=dev,hsqldb。

添加活动profile

spring.profiles.active属性遵循与其他属性相同的顺序规则:最高的属性源获胜。这意味着您可以在application.properties中指定活动配置文件,然后可以使用命令行开关替换它们。

有时,将特定于概要文件的属性添加到活动概要文件中而不是替换它们是很有用的。spring.profiles.include属性可用于无条件添加活动配置文件。SpringApplication入口点也有一个Java API来设置附加的配置文件(也就是说,在spring.profiles.active属性激活的那些文件之上)。请参见SpringApplication中的setAdditionalProfiles()方法

例如,当使用开关-spring.profiles.active=prod运行具有以下属性的应用程序时,还会激活proddb和prodmq配置文件:

---
my.property: fromyamlfile
---
spring.profiles: prod
spring.profiles.include:
 - proddb
 - prodmq


Tags:Spring boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言一个基于spring boot的JAVA开源商城系统,是前后端分离、为生产环境多实例完全准备、数据库为b2b2c商城系统设计、拥有完整下单流程和精美设计的java开源商城系统https://...【详细内容】
2021-09-17  Tags: Spring boot  点击:(119)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: Spring boot  点击:(175)  评论:(0)  加入收藏
大家都知道,MyBatis 框架是一个持久层框架,是 Apache 下的顶级项目。Mybatis 可以让开发者的主要精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活的生成满足需要的 sql 语句。使用简单的 XML 或注解来配置和映射原...【详细内容】
2021-07-06  Tags: Spring boot  点击:(96)  评论:(0)  加入收藏
首先,先看 SpringBoot 的主配置类:@SpringBootApplicationpublicclassStartEurekaApplication{publicstaticvoidmain(String[] args){SpringApplication.run(StartEurekaAppli...【详细内容】
2021-06-11  Tags: Spring boot  点击:(144)  评论:(0)  加入收藏
今天又要给大家介绍一个 Spring Boot 中的组件 --HandlerMethodReturnValueHandler。在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何...【详细内容】
2021-03-24  Tags: Spring boot  点击:(297)  评论:(0)  加入收藏
环境:SpringBoot2.3.9.RELEASE + SpringBootAdmin2.3.1说明:如果使用SpringBootAdmin2.4.*版本那么SpringBoot的版本也必须是2.4.*否则启动报错。Spring Boot Admin(SBA)是一个...【详细内容】
2021-03-22  Tags: Spring boot  点击:(350)  评论:(0)  加入收藏
要让项目实现 ssl 免密登录,首先需要开启 https 。所以先从 Spring Boot 如何开启 https 说起。创建服务端证书为了开启 https ,我们需要一份证书。实际开发中,会在网上申请一...【详细内容】
2021-01-07  Tags: Spring boot  点击:(159)  评论:(0)  加入收藏
短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信...【详细内容】
2020-12-31  Tags: Spring boot  点击:(186)  评论:(0)  加入收藏
在平常的开发过程中,我们经常需要对接口响应时间进行优化,但是呢个人感觉每次都去看浏览器的网络请求比较麻烦,因此,小编自己自己手写代码实现在控制台打印接口响应时间,这样非常...【详细内容】
2020-12-23  Tags: Spring boot  点击:(713)  评论:(0)  加入收藏
前言在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。那么何为限流呢?顾...【详细内容】
2020-12-15  Tags: Spring boot  点击:(121)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条