在项目运行中,包括多种环境,例如线上环境prod(product)、开发环境dev(development)、测试环境test、提测环境qa、单元测试unitest等等。不同的环境需要进行不同的配置,从而在不同的场景中跑我们的程序。例如prod环境和dev环境通常需要连接不同的数据库、需要配置不同的日志输出配置。还有一些类和方法,在不同的环境下有不同的实现方式。

Spring Boot 对此提供了支持,一方面是注解@Profile,另一方面还有多资源配置文件。

文章目录

  • 一、 @Profile注解使用说明
    • 1、`@Profile`的使用位置
      • (1) `@Prifile`修饰类
      • (2) `@Profile`修饰方法
      • (3)`@Profile`修饰注解
    • 2、profile激活
      • (1)配置文件方式激活profile
      • (2)命令行方式激活profile
  • 二、多Profile的资源文件
    • 1、资源配置文件
    • 2、使用例子

一、 @Profile注解使用说明

@profile注解的作用是指定类或方法在特定的 Profile 环境生效,任何@Component@Configuration注解的类都可以使用@Profile注解。在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean。

使用要求:

  • @Component@Configuration注解的类可以使用@profile
  • @Profile中需要指定一个字符串,约定生效的环境

1、@Profile的使用位置

(1) @Prifile修饰类

@Configuration
@Profile("prod")
public class JndiDataConfig {@Bean(destroyMethod="")public DataSource dataSource() throws Exception {Context ctx = new InitialContext();return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");}
}

(2) @Profile修饰方法

@Configuration
public class AppConfig {@Bean("dataSource")@Profile("dev")public DataSource standaloneDataSource() {return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL).addScript("classpath:com/bank/config/sql/schema.sql").addScript("classpath:com/bank/config/sql/test-data.sql").build();}@Bean("dataSource")@Profile("prod")public DataSource jndiDataSource() throws Exception {Context ctx = new InitialContext();return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");}
}

(3)@Profile修饰注解

@Profile注解支持定义在其他注解之上,以创建自定义场景注解。这样就创建了一个@Dev注解,该注解可以标识bean使用于@Dev这个场景。后续就不再需要使用@Profile("dev")的方式,这样即可以简化代码。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("prod")
public @interface Production {
}

2、profile激活

实际使用中,注解中标示了prod、test、qa等多个环境,运行时使用哪个profile由spring.profiles.active控制,以下说明2种方式:配置文件方式、命令行方式。

(1)配置文件方式激活profile

确定当前使用的是哪个环境,这边环境的值与application-prod.properties中-后面的值对应,这是SpringBoot约定好的。
在resources/application.properties中添加下面的配置。需要注意的是,spring.profiles.active的取值应该与@Profile注解中的标示保持一致。

spring.profiles.active=dev

除此之外,同理还可以在resources/application.yml中配置,效果是一样的:

spring:profiles:active: dev

(2)命令行方式激活profile

在打包后运行的时候,添加参数:

java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar   --spring.profiles.active=dev;

二、多Profile的资源文件

除了@profile注解的可以标明某些方法和类具体在哪个环境下注入。springboot的环境隔离还可以使用多资源文件的方式,进行一些参数的配置。

1、资源配置文件

Springboot的资源配置文件除了application.properties之外,还可以有对应的资源文件application-{profile}.properties。
假设,一个应用的工作环境有:dev、test、prod

那么,我们可以添加 4 个配置文件:

  • applcation.properties - 公共配置
  • application-dev.properties - 开发环境配置
  • application-test.properties - 测试环境配置
  • application-prod.properties - 生产环境配置

不同的properties配置文件也可以是在 applcation.properties 文件中来激活 profile:spring.profiles.active = test

2、使用例子

以下是一个多个资源配置文件的例子,主要区分了开发环境dev和线上环境prod。

在controller层中的Sound.java中新建一个接口,返回配置文件中的信息:name和local。

@Controller
@RequestMapping("/sound")
public class Sound {@Value("${com.name}")private String name;@Value("${com.location}")private String location;@RequestMapping("hello")@ResponseBodypublic String sound1(){System.out.println(name + "hello Spring Boot, " +location);return name + ",hello Spring Boot! " +location;}
}

application.properties文件内容如下:

## 多环境配置文件激活属性
spring.profiles.active=prod

application-dev.properties文件内容如下:

# 服务端口
server.port=1111#可以定义一些自己使用的属性,然后通过@Value("${属性名}}")注解来加载对应的配置属性
com.name=DEV
com.location=Beijing

application-prod.properties文件内容如下:

server.port=2222#可以定义一些自己使用的属性,然后通过@Value("${属性名}}")注解来加载对应的配置属性
com.name=Prod
com.location=Hubei

启动Springboot后,访问http://localhost:2222/sound/hello,则会有如下结果。如果此时访问http://localhost:11111/sound/hello则会无法访问,因为此时spring.profiles.active=prod激活的是prod环境,使用的是application-prod.properties中的配置。

更改application-dev.properties文件,spring.profiles.active=dev激活dev环境。重启Springboot则可以访问http://localhost:11111/sound/hello。

参考博客:
[1]: https://blog.csdn.net/xadjccl/article/details/81983768
[2]: https://www.cnblogs.com/jingmoxukong/p/10151785.html#%E7%A4%BA%E4%BE%8B%E6%BA%90%E7%A0%81
[3]: https://blog.csdn.net/he90227/article/details/52981747

Springboot中的@Profile注解相关推荐

  1. 难以想象SpringBoot中的条件注解底层居然是这样实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  2. 面试:SpringBoot中的条件注解底层是如何实现的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  3. springboot中的@Conditional注解

    springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...

  4. SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证

    作者:超级小豆丁 http://www.mydlq.club/article/49/ 目录 一.为什么使用 @Valid 来验证参数 二.@Valid 注解的作用 三.@Valid 的相关注解 四.使 ...

  5. springboot中使用@Transactional注解事物不生效的原因

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  6. SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)

    项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息.Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor .TaskScheduler 接口. ...

  7. springboot中mybatisplus基于注解的多对多级联查询

    mybatisplus使用注解多对多级联查询 mybatis提供了注解和xml两种方式配置我们的sql语句,我在接触使用的过程中更喜欢注解的方式,在我的上一个项目中,我全部使用mybatis注解去完成 ...

  8. SpringBoot中通过ConfigurationProperties注解的方式读取application.yml中配置的属性值

    场景 在SpringBoot后台项目中,某些固定的属性需要配置在配置文件application.yml中. 比如上传到服务器的文件路径. 然后在其他业务代码中比如上传文件接口中需要或者到配置的这个属性 ...

  9. SpringBoot中使用@Mapper注解需要哪个包

    场景 在Eclipse中新建springBoot项目后,要使用@Mapper注解. 实现 打开pom.xml 添加 <!-- mybatis整合Springboot --><depe ...

最新文章

  1. 一作解读:Microbiome马铃薯疮痂病与土壤微生物组关系新进展
  2. Announcing the Updated NGINX and NGINX Plus Plug‑In for New Relic (Version 2)
  3. python获取pid并杀死_用python记录运行pid,并在需要时kill掉它们的实例
  4. http 性能测试 wrk使用教程
  5. 返回一个数组的连续子数组和的最大值
  6. TensorFlow 训练单特征和多特征的线性回归
  7. 效率工具Focus for Mac,阻止应用弹窗,集中注意力
  8. 仿 微信飞机大战项目
  9. mysql批量插入跟更新_mysql批量插入以及批量更新
  10. 新兴视频处理工具VapourSynth压制教程
  11. 如何在html中使用特殊字体
  12. 扫码器 android 采集,caiPDA条码扫描采集器
  13. 纯色图制作APP代码
  14. 网页img 居中办法
  15. 6.0系统机器Xposed框架安装经验
  16. C#中的ASCII转换
  17. 带有当前位置坐标的地图
  18. Python3爬虫抓取网易云音乐热评实战
  19. 韩顺平老师的linux基础课(复习笔记)
  20. 2020年日历电子版(打印版)_2020年日历表(竖版-A4纸打印版)

热门文章

  1. c语言读取mat文件
  2. 计算机的桌面由哪些组成,计算机的硬件组成
  3. python画笛卡尔心形线方程_考研数学——Python绘制极坐标图,画笛卡尔心形线、玫瑰线、阿基米德螺线、伯努利双纽线(加深图像理解)...
  4. mysql创建数据表示例_Mysql创建数据表的方法介绍(附示例)
  5. w5500和stm32,TCP连接服务器失败,连不上远程服务器
  6. FPGA之FIFO IP核详细教程
  7. h5移动端实时获取摄像头拍照-可以通过上传图片进行人脸识别
  8. Python语言地球科学领域中的应用
  9. 光传输-政企OTN技术总结
  10. DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比