Spring Boot 针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板配置内容,但是,我们还是需要了解如何在Spring Boot中修改这些自动化的配置,以应对一些特殊场景

配置文件

Spring Boot的默认配置文件位置为 src/main/resources/application.properties ,关于 Spring Boot 应用的配置文件内容都可以在该文件中,根据我们引入的不同模块,可以在这里定义容器端口号、数据库连接信息、日志级别等各种配置信息,常用配置如下:

  • server.context-path:指定上下文路径,比如默认访问路径是http://localhost:8080,我将之改为http://localhost:8081/hello,就需要配置此属性值为 /hello
  • server.port=8090 :指定服务端口号为 8090
  • spring.application.name=hello:指定应用名(该名字后续Spring Cloud 中会被注册为服务名)

自定义参数

除了可以在Spring Boot的配置文件中设置各个模块中预定义的配置属性,也可以在配置文件中定义一些我们需要的自定义属性,比如在配置文件中增加如下内容:

book.name = springCloud

book.author=李四

然后,可以在应用中,通过@Value注解来加载这些自定义的参数,比如:

@Component

public class Book {

        @Value ("${book.name}")

        private String name;

        @Value ("${book.author}")

        private String author;

}

@Value注解可以支持两种表达式来进行配置,如下所示:

  • 一种是上面代码所示的 PlaceHolder 方式,格式为${…} 大括号内为PlaceHolder
  • 另一种是 SpEL表达式(Spring Expression Language),格式为 #{…},大括号内为 SpEL 表达式

通过自定义注入实体,就可以读取到配置属性,示例代码如下:

@RestController

@RequestMapping ("/hello")

public class HelloController {

 
 

        @Autowired

        private Book book;

 
 

        @RequestMapping ("getCount")

        public String getCount() {

                return "ok " + book.getName();

        }

}

参数引用

在 application.properties中的个参数之间可以直接通过使用 PlaceHolder 的方式来进行引用,比如:

book.name=springCloud

book.author=李四

book.desc= 作者 ${book.author} 写的 ${book.name}

使用随机数

在一些特殊的情况下,我们希望有些参数每次被加载时候不是一个固定的值,比如密钥、服务端口等,在Spring Boot 的属性配置文件中,可以使用${random}配置来产生随机的int值、long值或者string字符串,这样我们就可以很容易的通过配置随机生成属性,比如:

#-随机生成8080-8090内的随机数

server.port=${random.int(8080,8090)}

#--------------------------

#-随机生成字符串

org.drsoft.random=${random.value}

#-随机生成int

org.drsoft.random.int=${random.int}

#-随机生成long

org.drsoft.random.long=${random.long}

#-随机生成10以内的int

org.drsoft.random.intRagne=${random.int(10)}

#-机生成 uuid

命令行参数

使用命令 java -jar 来启动的方式,该命令除了启动应用外,还可以在命令行中指定应用的参数,比如 java - jar xxx.jar --server.port=8090 直接以命令行的方式设置服务端口属性,在用命令行方式启动 Spring Boot应用时,连续的两个减号就是对application.properties 中的属性进行赋值的标识

多环境配置

多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,在通过打包命令指定需要打包的内容之后进行区分打包,在Spring Boot 中,多环境配置的文件名需要满足application-{profile}.properties 的格式,其中{profile}对应环境标识,如下:

  • application-dev.properties:开发环境
  • application-test.properties:测试环境
  • application-prod.properties:生成环境

至于具体哪个配置文件会被加载,需要在
application.properties 文件中通过spring.profiles.action 属性来设置,其值对应配置文件中的{profile} 值。

加载顺序

为了能够更合理的重写各属性的值,其Spring Boot 使用了下面这种较为特别的属性加载顺序:

  • 命令行中传入的参数
  • SPRING_APPLICATION_JSON中的属性,SPRING_APPLICATION_JSON 是以JSON格式配置在系统环境变量中的内容
  • java:comp/env 中的
    JNDI 属性
  • java 的系统属性,可以通过System.getProperties()获取的内容
  • 操作系统的环境变量
  • 通过
    random.* 配置的随机属性
  • 位于当前应用
    Jar 包之外,针对不同{profile}环境的配置文件内容
  • 位于当前应用
    Jar 包之内,针对不同{profile}环境的配置文件内容
  • 位于当前应用
    Jar 包之外的
    application.properties 配置内容
  • 位于当前应用
    Jar 包之内的
    application.properties 配置内容

  • @Configuration 注解修改的类,通过
    @PropertySource 注解定义的属性
  • 应用默认属性,使用
    SpringApplication.setDefaultProperties 定义的内容

可以看到其中标黄的都是从应用Jar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载位置来取代Jar包之内的配置内容。

Spring Boot - 配置介绍的更多相关文章

  1. Spring Boot 配置元数据指南

    1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot C ...

  2. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

  3. spring boot配置druid连接池连接mysql

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  4. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  5. Spring Boot -- 配置切换指南

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  6. Spring Boot 配置优先级顺序

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  7. spring boot 配置注入

    spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...

  8. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  9. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

随机推荐

  1. Django 修改视图文件(views.py)并加载Django模块 + 利用render_to_response()简化加载模块 +locals()

    修改视图代码,让它使用 Django 模板加载功能而不是对模板路径硬编码.返回 current_datetime 视图,进行如下修改: from django.template.loader impo ...

  2. 【异常】idea执行Main方法出现 Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

    一.异常复现步骤 1)首先得是一个Spring MVC项目 注:Spring Boot项目有内置的web 容器,不会出现该问题 2)main方法存在于使用HttpServletRequest类的类中 ...

  3. ajax上传下载自定义圆形滚动条

    demo地址:https://pan.baidu.com/s/1qYNYCFE 因为项目需要在上传文件的时候,知道上传的进度,所以封装了一个方法,在上传文件的时候动态显示上传进度,主要根据XMLHtt ...

  4. 完整的Django入门指南学习笔记7 网页自动翻译

    转自[https://simpleisbetterthancomplex.com/series/2017/10/16/a-complete-beginners-guide-to-django-part ...

  5. hadoop集群中动态添加节点

    集群的性能问题需要增加服务器节点以提高整体性能 https://www.cnblogs.com/fefjay/p/6048269.html hadoop集群之间hdfs文件复制 https://www ...

  6. sql server替换字段中的某个字符

    USE [Vocabulary ] GO --UPDATE [dbo].[table name] --   SET [en] = '' --      ,[cn] ='' -- WHERE --cha ...

  7. STL 小白学习(6) queue

    //queue 一端插入 另一端删除 //不能遍历(不提供迭代器) 不支持随机访问 #include <queue> #include <iostream> using nam ...

  8. Andriod Studio两种签名机制V1和V2的区别

    Android Studio 2.2以上版本打包apk的时候,我们会发现多了个签名版本(v1.v2)选择,如下图红色方框所示 问题描述(v1和v2) Android 7.0中引入了APK Signat ...

  9. 防Bug笔记

    最近不知道咋回事,写代码特别多bug出来.故专门做一笔记,记下容易犯的bug,以期日后减少低级错误. Python 1. JavaScript 1.多用``, 少用''/""

  10. LeetCode 47 全排列II

    题目: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路: 与上一题相比,这题多了一 ...