溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring profile的示例分析

發(fā)布時間:2021-09-09 12:24:26 來源:億速云 閱讀:88 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)spring profile的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

背景

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

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

比如我們這樣使用

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

分析

上述的profile大家應(yīng)該不會存有疑問 當(dāng)profile為prod或者unit-test的時候才會生效。

但是如果我們使用非呢~如何確保在某些情況下不生效!

spring提供了常見的!來進(jìn)行描述

因此如果想要在非生產(chǎn)環(huán)境生效只要簡單的寫成

@Profile({"!prod"})

那么如何在多個環(huán)境下不生效呢???

自作聰明的某些人【我】如下代碼

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

那么實際情況是否如此呢???

我們看一下對應(yīng)的代碼

代碼

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);

從上述可以看到應(yīng)該是or的條件

當(dāng)然代碼如下

@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;
}

因此可以看到當(dāng)是!條件的時候會判斷如果當(dāng)前未激活profile返回true 否則當(dāng)前是正常條件的換當(dāng)前profile如果激活則返回true 當(dāng)上述條件都不滿足才返回false

因此上述邏輯告訴我們其實應(yīng)該是或者的邏輯。因此

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

!prod||!unit-test===>!(prod&&unit-test)  也就是說當(dāng)prod和unit-test都生效的時候才不會注冊 其他調(diào)均都會注冊生效

感謝各位的閱讀!關(guān)于“spring profile的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI