转载

原 荐 关于spring profile的误解

后端之路 springboot

正文

关于spring profile的误解

原 荐 关于spring profile的误解
  Mr_Qi 发布于 55分钟前

字数 592

阅读 7

收藏 2

Spring

十年阿里,就只剩下这套Java开发体系了 >>> 原 荐 关于spring profile的误解

背景

spring的profile大家都是用的溜的飞起~

那么profile的组合如何使用呢???

比如我们这样使用

@Profile({"prod", "unit-test"})

分析

上述的profile大家应该不会存有疑问 当profile为prod或者unit-test的时候才会生效。

但是如果我们使用非呢~如何确保在某些情况下不生效!

spring提供了常见的!来进行描述

因此如果想要在非生产环境生效只要简单的写成

@Profile({"!prod"})

那么如何在多个环境下不生效呢???

自作聪明的某些人【我】如下代码

@Profile({"!prod", "!unit-test"})

那么实际情况是否如此呢???

我们看一下对应的代码

代码

profile是通过profileCondition来完成控制的

class ProfileCondition implements Condition {
 
   @Override
   public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
      if (context.getEnvironment() != null) {
         MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
         if (attrs != null) {
            for (Object value : attrs.get("value")) {
               if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
                  return true;
               }
            }
            return false;
         }
      }
      return true;
   }
 
}

很明显可以看到了acceptsProfiles

/**
 * Return whether one or more of the given profiles is active or, in the case of no
 * explicit active profiles, whether one or more of the given profiles is included in
 * the set of default profiles. If a profile begins with '!' the logic is inverted,
 * i.e. the method will return true if the given profile is <em>not</em> active.
 * For example, <pre class="code">env.acceptsProfiles("p1", "!p2")</pre> will
 * return {@code true} if profile 'p1' is active or 'p2' is not active.
 * @throws IllegalArgumentException if called with zero arguments
 * or if any profile is {@code null}, empty or whitespace-only
 * @see #getActiveProfiles
 * @see #getDefaultProfiles
 */
boolean acceptsProfiles(String... profiles);

从上述可以看到应该是or的条件

当然代码如下

@Override
public boolean acceptsProfiles(String... profiles) {
   Assert.notEmpty(profiles, "Must specify at least one profile");
   for (String profile : profiles) {
      if (StringUtils.hasLength(profile) && profile.charAt(0) == '!') {
         if (!isProfileActive(profile.substring(1))) {
            return true;
         }
      }
      else if (isProfileActive(profile)) {
         return true;
      }
   }
   return false;
}

因此可以看到当是!条件的时候会判断如果当前未激活profile返回true 否则当前是正常条件的换当前profile如果激活则返回true 当上述条件都不满足才返回false

因此上述逻辑告诉我们其实应该是或者的逻辑。因此

@Profile({"!prod", "!unit-test"})

!prod||!unit-test===>!(prod&&unit-test)  也就是说当prod和unit-test都生效的时候才不会注册 其他调均都会注册生效

© 著作权归作者所有

共有人打赏支持

原 荐 关于spring profile的误解

Mr_Qi

粉丝 264

博文 326

码字总数 341201

作品 0

南京

程序员

相关文章 最新文章

Spring核心——Profile管理环境

抽象环境的概念 在介绍Spring核心模块为运行环境管理提供的功能之前,咱们先得解释清楚“运行环境”是什么。 码砖早年,对上下文(Context)、环境(Environment)一直都是傻傻分不清楚,感觉...

随风溜达的向日葵

07/30

0

0

JDK8新特性之Lambda表达式

什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。 Lambda语法 一行执行语句的写法...

java技术栈

2017/10/05

0

0

spring cloud config server 客户端权限验证配置401

用的spring boot 2.0 在周立的教程书上以及很多网上的资料,关于config 服务端的账号密码设置都是引入security依赖后配置 security: basic: enabled: true user: name: root password: root...

呆呆的萌新

06/12

0

0

Spring事务传播机制

概述 当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务 环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个...

rouway

2011/07/04

0

0

Spring Boot - Profile配置

Profile是什么 Profile我也找不出合适的中文来定义,简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件。 Profile使用 假如有开发、测试、生产三个不同的环境,需...

Java技术栈

06/10

0

0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之Spring5.0下函数式编程(32)

上一篇讲了注解编程,今天熟悉lambda的话,使用第二种函数式编程做开发! 1、pom添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s......

木九天

5分钟前

0

0

twisted tcp 客户端重连

在工业应用(物联网中)往往需要一些 tcp作为客户端去连接服务器,成功连接后对物联网设备进行操作,但是如果因为硬件的一些原因可能会出实现重新上电, 连接断开, 所以需要重连接的一些设备的服务...

一一无念

6分钟前

0

0

学习微服务的服务链路追踪——Spring Cloud Sleuth+zipkin

spring cloud sleuth提供了服务链路追踪,并兼容了zipkin,Zipkin是一个链路跟踪工具,可以用来监控微服务集群中调用链路的通畅情况。 1.本来想新建一个有关zipkin-server的自定义zipkin服务器...

啊哈关关

14分钟前

1

0

原 荐 关于spring profile的误解
php api接口优化和使用

1、接口文档 可以使用phpdocument插件去生成接口文档 注意:需要代码注释格式规范 可以选择模板 2、时间开销检查 xhprof检查时间开销,定位问题 3、自测 建议选择PHPunit 4、监控 建议使用s...

DamienChen

17分钟前

0

0

Linux的基本操作

文件权限与目录配置 各个权限的分数如下:   r:4 w:2 x:1 所以修改权限就有两种方法: 第一种就是利用chmod命令,例如chmod -r 740 test.txt就是让拥有者有rwx权限,组有r权限,other没有权...

全部原谅

29分钟前

1

0

原 荐 关于spring profile的误解

没有更多内容

加载失败,请刷新页面

加载更多

下一页

原文  https://my.oschina.net/qixiaobo025/blog/1927580
正文到此结束
Loading...