一起来学 SpringBoot 2.x | 第二篇:SpringBoot 配置详解

SpringBoot3.X配置OAuth 通过对比的方式,深度解析SpringBoot2.X和SpringBoot3.X对一OAuth配置的区别。 阅读详情

点击上方“芋道源码”,选择“置顶公众号”

技术文章第一时间送达!

源码精品专栏

 

摘要: 原创出处 http://blog.battcn.com/2018/04/22/springboot/v2-config-properties/ 「唐亚峰」欢迎转载,保留摘要,谢谢!

  • 自定义属性配置

  • 自定义文件配置

  • 多环境化配置

  • 外部命令引导

  • 总结

  • 说点什么


SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程

上一篇介绍了 SpringBoot 由来及构建方式,通过第一章的教程我们对 SpringBoot 不在感到陌生,可以发现 SpringBoot 虽然干掉了 XML 但未做到 零配置,它体现出了一种 约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。 一般情况下默认的配置足够满足日常开发所需,但在特殊的情况下,我们往往需要用到自定义属性配置、自定义文件配置、多环境配置、外部命令引导等一系列功能。不用担心,这些 SpringBoot 都替我们考虑好了,我们只需要遵循它的规则配置即可

准备前提

为了让 Spring Boot 更好的生成配置元数据文件,我们需要添加如下依赖(该依赖可以不添加,但是在 IDEA 和 STS 中不会有属性提示,没有提示的配置就跟你用记事本写代码一样苦逼,出个问题弄哭你去),该依赖只会在编译时调用,所以不用担心会对生产造成影响…

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

自定义属性配置

在 application.properties 写入如下配置内容

my1.age=22
my1.name=battcn

其次定义 MyProperties1.java 文件,用来映射我们在 application.properties 中的内容,这样一来我们就可以通过操作对象的方式来获得配置文件的内容了

package com.battcn.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author Levin
 * @since 2018/4/23 0023
 */
@Component
@ConfigurationProperties(prefix = "my1")
public class MyProperties1 {

    private int age;
    private String name;
    // 省略 get set

    @Override
    public String toString() {
        return "MyProperties1{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

接下来就是定义我们的 PropertiesController 用来注入 MyProperties1 测试我们编写的代码,值得注意的是 Spring4.x 以后,推荐使用构造函数的形式注入属性…

import com.battcn.properties.MyProperties1;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Levin
 * @since 2018/4/23 0023
 */
@RequestMapping("/properties")
@RestController
public class PropertiesController {

    private static final Logger log = LoggerFactory.getLogger(PropertiesController.class);

    private final MyProperties1 myProperties1;

    @Autowired
    public PropertiesController(MyProperties1 myProperties1) {
        this.myProperties1 = myProperties1;
    }

    @GetMapping("/1")
    public MyProperties1 myProperties1() {
        log.info("=================================================================================================");
        log.info(myProperties1.toString());
        log.info("=================================================================================================");
        return myProperties1;
    }
}

打开浏览器,输入如下地址: http://localhost:8080/properties/1,观察控制台,监听到如下内容则表示程序正确

2018-04-23 15:51:43.145  INFO 15352 --- [nio-8080-exec-2] c.b.controller.PropertiesController      : =================================================================================================
2018-04-23 15:51:43.145  INFO 15352 --- [nio-8080-exec-2] c.b.controller.PropertiesController      : MyProperties1{age=22, name='battcn'}
2018-04-23 15:51:43.145  INFO 15352 --- [nio-8080-exec-2] c.b.controller.PropertiesController      : =================================================================================================

自定义文件配置

定义一个名为 my2.properties 的资源文件,自定义配置文件的命名不强制 application 开头

my2.age=22
my2.name=Levin
my2.email=1837307557@qq.com

其次定义 MyProperties2.java 文件,用来映射我们在 my2.properties 中的内容。

package com.battcn.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * @author Levin
 * @since 2018/4/23 0023
 */
@Component
@PropertySource("classpath:my2.properties")
@ConfigurationProperties(prefix = "my2")
public class MyProperties2 {

    private int age;
    private String name;
    private String email;
    // 省略 get set 

    @Override
    public String toString() {
        return "MyProperties2{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

接下来在 PropertiesController 用来注入 MyProperties2 测试我们编写的代码

@GetMapping("/2")
public MyProperties2 myProperties2() {
    log.info("=================================================================================================");
    log.info(myProperties2.toString());
    log.info("=================================================================================================");
    return myProperties2;
}

打开浏览器,输入如下地址: http://localhost:8080/properties/2,观察控制台,监听到如下内容则表示程序正确

2018-04-23 15:59:45.395  INFO 6232 --- [nio-8080-exec-4] c.b.controller.PropertiesController      : =================================================================================================
2018-04-23 15:59:45.395  INFO 6232 --- [nio-8080-exec-4] c.b.controller.PropertiesController      : MyProperties2{age=22, name='Levin', email='1837307557@qq.com'}
2018-04-23 15:59:45.395  INFO 6232 --- [nio-8080-exec-4] c.b.controller.PropertiesController      : =================================================================================================

多环境化配置

在真实的应用中,常常会有多个环境(如:开发,测试,生产等),不同的环境数据库连接都不一样,这个时候就需要用到spring.profile.active 的强大功能了,它的格式为 application-{profile}.properties,这里的 application 为前缀不能改,{profile} 是我们自己定义的。

创建 application-dev.properties、application-test.properties、application-prod.properties,内容分别如下

application-dev.properties

server.servlet.context-path=/dev

application-test.properties

server.servlet.context-path=/test

application-prod.properties

server.servlet.context-path=/prod

在 application.properties 配置文件中写入 spring.profiles.active=dev,这个时候我们在次访问 http://localhost:8080/properties/1 就没用处了,因为我们设置了它的context-path=/dev,所以新的路径就是 http://localhost:8080/dev/properties/1 ,由此可以看出来我们激活不同的配置读取的属性值是不一样的

外部命令引导

前面三种方式都是基于配置文件层面的,那么有没有办法外部引导呢,假设这样的场景,我们对已经开发完成的代码打包发布,期间在测试环境测试通过了,那么即可发布上生产,这个时候是修改application.properties的配置方便还是直接在命令参数配置方便呢,毫无疑问是后者更有说服力。默认情况下,SpringApplication 会将命令行选项参数(即:–property,如–server.port=9000)添加到Environment,命令行属性始终优先于其他属性源。

如何测试?

  • 进入到项目目录,此处以我本地目录为主:F:/battcn-workspace/spring-boot2-learning/chapter2

  • 然后打开 cmd 程序,不会在当前目录打开 cmd 的请自行百度,输入:mvn package

  • 打包完毕后进入到:F:/battcn-workspace/spring-boot2-learning/chapter2/target 目录中去,我们可以发现一个名为chapter2-0.0.1-SNAPSHOT.jar 的包

  • 接着在打开 cmd 程序,输入:java -jar chapter2-0.0.1-SNAPSHOT.jar --spring.profiles.active=test --my1.age=32。仔细观察spring.profiles.active=test、my1.age=32 这俩配置的键值是不是似曾相识(不认识的请从开头认真阅读)

  • 最后输入测试地址:http://localhost:8080/test/properties/1 我们可以发现返回的JSON变成了 {"age":32,"name":"battcn"} 表示正确

总结

  • 掌握@ConfigurationProperties、@PropertySource 等注解的用法及作用

  • 掌握编写自定义配置

  • 掌握外部命令引导配置的方式

目前很多大佬都写过关于 SpringBoot 的教程了,如有雷同,请多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…

说点什么

全文代码:https://github.com/battcn/spring-boot2-learning/tree/master/chapter2

666. 彩蛋

如果你对 SpringBoot 感兴趣,欢迎加入我的知识星球一起交流。


知识星球

目前在知识星球(https://t.zsxq.com/2VbiaEu)更新了如下 Dubbo 源码解析如下:

01. 调试环境搭建
02. 项目结构一览
03. API 配置(一)之应用
04. API 配置(二)之服务提供者
05. API 配置(三)之服务消费者
06. 属性配置
07. XML 配置
08. 核心流程一览

09. 拓展机制 SPI

10. 线程池

11. 服务暴露(一)之远程暴露(Injvm)

12. 服务暴露(二)之远程暴露(Dubbo)

...
一共 60 篇++

SpringBoot2.x系列教程之SpringBoot2.x配置大全03 一. SpringBoot2.x配置大全03 #THREAD DUMP ENDPOINT(ThreadDumpEndpoint) management.endpoint.threaddump.cache.time-to-live = 0ms #可以缓存响应的最长时间。 management.endpoint.threaddump.enabled = true #是否启用threaddump端点。 #HEALTH INDICATORS management.health.db.enabled = t 阅读详情

相关推荐

SpringBoot2.x配置大全02

一. SpringBoot2.x配置大全(中) #JEST (Elasticsearch HTTP客户端)(JestProperties) spring.elasticsearch.jest.connection-timeout = 3s #连接超时。 spring.elasticsearch.jest.multi-threaded = true #是否从多个执行线程启用连接请求。 spring.elasticsearch.jest.password = #登录密码。 spring.elasticse

qfchenjunbo的博客 490

一起来学 SpringBoot 2.x | 第三篇:SpringBoot 日志配置

点击上方“芋道源码”,选择“置顶公众号”技术文章第一时间送达!源码精品专栏 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )中文详细注释...

芋道源码 505

廖雪峰 Spring 2.0 核心技术与最佳实践 高清扫描版

spring 2.0 有基础到深入详细讲解教程,适合初学者到高级工程师使用

芋道 Spring Boot 安全框架 Spring Security 入门

本文在提供完整代码示例,可见GitHub - YunaiV/SpringBoot-Labs: 一个涵盖六个专栏:Spring Boot 2.X、Spring Cloud、Spring Cloud Alibaba、Dubbo、分布式消息队列、分布式事务的仓库。希望胖友小手一抖,右上角来个 Star,感恩 1024的 对应lab-01-spring-security目录。 原创不易,给点个Star嘿,一起冲鸭! 1. 概述 基本上,在所有的开发的系统中,都必须做认证(authenticat...

chen1133的博客 9576

廖师兄2小时学会springboot

廖师兄2小时学会springboot 第1章 SpringBoot介绍 1-1 SpringBoot介绍和课程安排 1-1 SpringBoot介绍 第2章 第一个SpringBoot应用 快速构建第一个SpringBoot应用 2-1 第一个SpringBoot应用 第3章 项目属性配置 项目属性配置的各种方法 3-1 项目属性配置 第4章 Controller的使用 介绍SpringBoot项目中Controller的使用 4-1 Controller的使用 第5章 数据库操作 SpringBoot中使用spring-data-jpa 5-1 数据库操作(上) (12:33) 5-2 数据库操作(下) 第6章 事务管理 演示了SpringBoot中使用事务的简单例子 6-1 事务管理 第7章 课程回顾 回顾课程内容 7-1 课程回顾

廖雪峰springboot两小时入门课程的工程

廖雪峰springboot两小时入门课程的工程

一起来学 SpringBoot 2.x | 第二十七篇:优雅解决分布式限流

http://www.iocoder.cn/Spring-Boot/battcn/v2-cache-redislimter/    SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 在前面的两篇文章中,...

Java_Jsp_Ssh的博客 2136

LibreNMS实战:5分钟搞定Docker部署与中文配置(附常见问题排查)

本文详细介绍了如何使用Docker在5分钟内快速部署LibreNMS,并完成中文界面优化。从环境准备到容器启动,再到中文语言包安装和系统配置调整,提供了完整的实战指南。同时,文章还包含常见问题排查和性能调优建议,帮助用户高效搭建网络监控系统。

e1f2g的博客 1282

springboot2.x、3.x学习

springboot2.x一、零散知识点补充 一、零散知识点补充 1、@Import注解:导入组件,给容器中自动创建组件 (1)@Import必须配合组件声明的注解一起使用,比如:@Configuration、@Controller、@Service (2)案例代码:使用@Import (3)获取容器中的组件并打印 (4)运行结果:可以看见容器中已经有相关的bean了 2、@Conditional()注解:满足指定条件给容器中创建组件 举两个实现@Conditional的例子: (1)使用@Condi

furenqiang的博客 3676

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

况老师话竞赛&blog 2206

PCB设计教程【入门篇】——PCB设计基础-PCB构成与组成

本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理。

2501_91732643的博客 7661

一起来学 SpringBoot 2.x | 第十篇:使用 Spring Cache 集成 Redis

点击上方“芋道源码”,选择“置顶公众号”技术文章第一时间送达!源码精品专栏 精尽 Dubbo 原理与源码 69 篇精尽 Netty 原理与源码 61 篇中文详细注释的开源...

芋道源码 452

fpga进阶--时序约束

1、基础概念 1.1 建立(setup)/保持(hold)时间 上述的锁存沿会将数据保存下来,但是必须要满足一定的条件: 建立时间Tsu:在时钟有效沿之前,数据必须保持稳定的最小时间; 保持时间Th:在时钟有效沿之后,数据必须保持稳定的最小时间; 1.2 亚稳态(Metastability) 亚稳态是由于违背了触发器的建立和保持时间而产生的,设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时间内发生了变化,那么输...

HHH的博客 2443

SpringBoot2.x 整合Druid数据源(详解及配置配置)

一、我们先说启动SpringBoot2.x的默认数据源 首先正常新建一个springBoot2.x项目,引入web依赖 下面是h2数据库为例,在Maven中加入依赖 &amp;amp;amp;amp;amp;amp;lt;dependency&amp;amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;amp;lt;groupId&amp;amp;amp;amp;amp;amp;gt;org.springfra

客官你来啦,姑娘任你挑 1万+

在国产麒麟系统上,用Postfix和Dovecot手搓一个内部邮件服务器(附Foxmail配置)

本文详细介绍了在国产麒麟系统上使用Postfix和Dovecot搭建内部邮件服务器的完整流程,包括系统准备、核心配置、安全加固及客户端适配。针对国产环境的特殊需求,提供了依赖包适配、配置差异和Foxmail客户端配置的实用解决方案,助力企业实现高效内部协作。

weixin_33722405的博客 371

FPGA,关于安装使用libero IDE V9.2 及其gold floating license配置

3、license安装根据,下面的提示进行,跟随setting up the license server on a host教程操作。1、从官网下载Libero IDE v9.2(如下图中的Libero IDE v9.2 software)4、下载完成license解压包后还需要下载 Daemons license ,地址如下。(2)第一行并不是在内填写,而是直接用您电脑名替换掉(1)修改license.bat前四行是,其务必保持和案例位置相同(避免出错)............

JasonK的博客 4300

SpringBoot2.x配置HTTPS访问

SpringBoot2.x配置HTTPS访问,总体上可以分为两大步:一.生成SSL证书;二.配置HTTPS访问。 一.生成SSL证书 取得SSL证书的方法有:(1)阿里云购买免费的ssl证书 (2)用命令生成ssl证书 因为在阿里云购买后需要填写域名,所以这里选择第(2)种方式:用命令生成ssl证书 1.新建一个证书目录,例如D:\sslca, 打开cmd命令窗口,切换到D:\s...

大头皮鞋的博客 1万+

HSM 网络安全 信息安全

HSM HSM信息安全功能 汽车电子网络安全中HSM 的应用场景 选择适合汽车电子网络安全的 HSM 符合汽车安全标准和法规要求的HSM HSM 在汽车电子网络安全中的可靠性和安全性 评估汽车电子网络的安全性 汽车 HSM(Hardware Security Module)模块开发 汽车 HSM(Hardware Security Module)模块测试

天赐好车的博客 1240

一起来学SpringBoot | 第二篇:SpringBoot配置详解

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 上一篇介绍了SpringBoot由来及构建方式,通过第一章的教程我们对SpringBoot不在感到陌生,可以发现SpringBoot虽然干掉了 XML 但未做...

LuisChen的博客 9095

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2072

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springboot-2.x:配置详解

springboot-2.x:配置详解

拒绝熬夜啊的博客 1067

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot配置log4j2详解

一,背景 后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发。程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题所在。 Spring Boot 可以集成很多不同的日志系统,目前有关日志的开源代码很多,如log4j、sl4j和log4j2 其中最常用的Apache Log4j,而Log4j 2是Log4j的升级版本,Log4j 2相对于Log4j 1.x 有了很多显著的改善。所以这篇博客就直接来说说Spring.

m0_61035392的博客 9947

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SpringBoot2.x系列教程之SpringBoot2.x配置大全01

SpringBoot2.x系列教程之SpringBoot2.x配置大全01 作者:一一哥 一. SpringBoot2.x配置大全(上) #================================================= ================== #COMMON SPRING BOOT PROPERTIES ## 此样本文件作为指南提供。不要将它的#co...

一一哥 1522

SpringBoot2.x配置多数据源

SpringBoot2.x配置多数据源 本文章主要实现配置多数据源,适用springBoot2.x版本,2.0以下版本可以参考我的博客springBoot整合Hakari数据库连接池 一、前言以及搭建环境 springBoot1.x版本的数据库连接池不是Hakari,在springBoot2.0版本以后才默认是Hakari,现在很多druid数据库连接池,但是他们的性能我并没有进行比较,所以还是使...

生命的意义在于创造和毁灭 7653

SpringBoot2.X正确配置以及集成hibernate5正确姿势

个人认为本人是目前SpringBoot2.X集成hibernate5最全的写法,大家有什么意见建议欢迎评论。 本人前面配置以及代码使用图片展示,方便圈出注意点,图片中的代码将在文章结尾一一放出。 1.springboot2.x的application.yml的配置文件 注意点在于2.*相较于1.*项目名访问设置不一样了。还有session时间的设置方法,具体的可以看我的注释。 2.applica...

wt592376761的博客 1万+
上一篇: 分布式消息队列 RocketMQ 源码分析 —— Message 顺序发送与消费
下一篇: 分布式消息队列 RocketMQ 源码分析 —— 高可用
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值