文章目录

  • 什么是profile
  • 1. application-{profile}.properties文件
    • 1.1 profile的多种激活方式
    • 1.2 spring.profiles.include属性
    • 1.3 总结
  • 2. @Profile
    • 2.1 注解可以使用的位置
    • 2.2 自定义注解
    • 2.3 注意
  • 3. 和maven的profile一起使用

什么是profile

想必大家都有这种经历,我们开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,他们的配置文件一般不同,如数据库地址。当我们要向各个环境发布程序时,需要人工处理这些配置文件,这显然麻烦且易错。有了profile,一切问题就简单了。简单讲profile就是一组配置,不同profile提供不同组合的配置,程序运行时可以选择使用哪些profile来适应环境。

1. application-{profile}.properties文件

我们先来搭建一个简单的springboot项目快速了解多profile的使用。项目结构非常简单:

除了application.properties还有多个application-{profile}.properties(格式必须为这样),在每个配置文件中项目启动的端口是不一样的。

在application.properties使用spring.profiles.active=prod来指定生效的配置文件为application-prod.properties.启动项目后可以在控制台看到启动端口为application-prod.properties里配置的server.port=8084

1.1 profile的多种激活方式

  • 第一种就是上面的在配置文件中通过spring.profiles.active=来指定,注意可以激活多个profile,如spring.profiles.active=prod,dev,如果都存在某值,执行last win策略。
  • 通过命令行方式。优先级高于第一种的spring.profiles.active
           执行java -jar xxx.jar,可以观察到服务端口被设置为8082。
           执行java -jar xxx.jar –spring.profiles.active=test,可以观察到服务端口被设置为8083,也就是(test)环境的配置
  • 通过虚拟机参数。-Dspring.profiles.active=dev
  • 使用编程的方式激活。
@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);applicationContext.getEnvironment().setActiveProfiles("dev");}
}

1.2 spring.profiles.include属性


       意思是无论执行哪个profile,都会去加载application-mq.properties里的配置。但是注意,只会去加载application-mq.properties里独有的配置,如果application-mq.properties也有server.port字段并不会生效。
       可以利用这种方式简化配置文件的书写,如在application-mq.properties书写各个环境都有的mq配置信息,不必都夹杂在application.properties里。

1.3 总结

  • application.properties文件是必定要加载的,而且是先加载的,无论是通过哪种方式指定的。
  • 当加载完application文件之后才加载指定的profiles文件
  • 如果application文件和指定的profile文件有相同的配置或冲突的配置项,则以profile中的为基准
  • application文件中写通用的配置项,profile文件中写特定环境的配置项,spring.profiles.include指定公共的配置项(起到了分离的作用),这样可以简化配置文件的书写。

2. @Profile

通过@Profile注解,我们可以根据所激活的不同的环境,生成不同的bean。
如只在dev环境下启动swagger2:

/*** swagger2的配置,只在开发环境dev下存在*/
@Configuration
@EnableSwagger2
@Profile("dev")
public class Swagger2Config {}

@profile官方博客介绍

2.1 注解可以使用的位置

  • @component或@Configuration修饰的类上
  • 作为元注解修饰自定义注解
  • 任何@Bean修饰的方法上

2.2 自定义注解

@Profile注解需要接受一个字符串,作为场景名。这样每个地方都需要记住这个字符串。Spring的@Profile注解支持定义在其他注解之上,以创建自定义场景注解。


@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Profile("dev")
public @interface Dev{}

这样就创建了一个@Dev注解,该注解可以标识bean使用于@Dev这个场景。后续就不再需要使用@Profile(“dev”)的方式(这样即可以简化代码)。

2.3 注意

  • @Profile({“p1”, “!p2”})的意思为p1的profile生效或p2的profile为生效时就会去生成修饰的类
  • 如果要使用不同环境下生成不同配置的同一个bean,方法名不要相同,即尽量不要重载。

3. 和maven的profile一起使用

参看这篇博客结合maven的profile使用

profile之springboot相关推荐

  1. springboot配置多项目下统一切换不同环境变量profile办法

    springboot配置多项目下统一切换不同环境变量profile办法 springboot 适合于微服务那种多项目开发,每一个小项目就是一个springboot 项目,比如我们这样: 问题发生: 我 ...

  2. maven(三)最详细的profile的使用

    文章目录 前言 1. 原理 2. 应用演示 2.1 项目结构 2.2 激活方式 1. 通过maven命令参数 2. 通过pom文件里的activation属性 3. settings.xml中使用ac ...

  3. 8. SpringBoot基础学习笔记

    SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...

  4. 【Java笔记+踩坑】SpringBoot基础2——运维实用

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

  5. SpringBoot开发实用

    SpringBoot 文档更新日志 版本 更新日期 操作 描述 v1.0 2021/11/14 A 基础篇 v1.0.1 2021/11/30 U 更新基础篇错别字若干,不涉及内容变更 v2.0 20 ...

  6. Spring相关文章汇总篇【Spring,SpringBoot,SpringCloud等】

      因为Spring框架包含的组件比较多,写的博客内容也比较多,虽然有分专栏但是依然不方便查找,所以专门用一篇文章来记录相关文章,会不定期更新. 一.Spring 1.基础内容 Spring介绍 Sp ...

  7. Profile,多配置管理,maven和spring.profiles.active可以做到

    maven加上profiles标签,mvn clean package -P prod,maven打包的时候会将prod下的文件替换src/main/resources下的文件 <profile ...

  8. 一文了解SpringBoot的配置文件

    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringBoot相关知识相关知识,打造完整的云原生学习步骤,提升工程化编码能力和思维能力,写出高质量代码.希望大家都能够从中有所收获,也请大家多 ...

  9. 【SpringBoot从入门到精通】第四章 Springboot配置文件

    四.Springboot配置文件 4.1 默认配置文件 Springboot使用一个全局的配置文件,配置文件名是固定的,application. 配置文件的作用: 修改Springboot自动配置的默 ...

最新文章

  1. 区块链将重新定义世界
  2. 网易 for linux,NetEaseMusic
  3. python使用教程cmd啥意思-Python 中的cmd模块学习
  4. typedef 用法总结
  5. 洛谷 [SDOI2015]约数个数和 解题报告
  6. vue搜索好友_Vue实现类似通讯录功能(中)
  7. BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)
  8. Word2013中怎样设置同一文档内粘贴选项
  9. C++ opengl 深度缓冲区
  10. struts2数据库操作_Struts 2操作错误和操作消息
  11. DM***+GET***测试
  12. windows重置net use或者SMB协议
  13. 今日头条 Android ‘秒‘ 级编译速度优化
  14. 如何用电脑画平面坐标图_如何画坐标图?
  15. IO口电压域io-domain核对流程
  16. font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;网页设计中的默认字体
  17. 无聊却很有意思的事情
  18. 如何配置NATAPP
  19. 活期利率是怎么计算的?
  20. Swift实战-豆瓣电台(四)歌曲列表的展现

热门文章

  1. python与vfp做桌面数据库_VFP数据库系统开发实例(附图)
  2. sql语言和php,SQL语言快速入门(三)_php
  3. linux下写sql语言,如何写这个sql语句?
  4. java的imshow方法_imshow窗口是截止的
  5. labview如何加载库_迈德威视工业相机LabView 开发指导
  6. 一个平行四边形可以分成四个_【八年级下】数学 平行四边形(3)菱形
  7. 四十五、Gtihub+Hexo+icarus搭建自己的博客
  8. crt脚本怎么添加等待时间_抖音文案怎么写吸引人?130个抖音文案素材、案例分享!...
  9. 系统调研450篇文献,微软亚洲研究院推出超详尽语音合成综述
  10. PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能