当前位置:主页 > java教程 > 浅谈关于spring profile的误解

spring profile的误解及易错点整理

发布:2019-06-07 16:07:31 187


我们帮大家精选了spring相关的编程文章,网友牧秋英根据主题投稿了本篇教程内容,涉及到spring、profile、浅谈关于spring profile的误解相关内容,已被123网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

浅谈关于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都生效的时候才不会注册 其他调均都会注册生效


参考资料

相关文章

  • springboot+webmagic实现java爬虫jdbc及mysql实例代码

    发布:2020-02-10

    今天小编就为大家分享一篇springboot+webmagic实现java爬虫jdbc及mysql的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • 学习Spring boot项目redisTemplate实现轻量级消息队列

    发布:2020-03-21

    这篇文章主要给大家介绍了关于Spring boot项目redisTemplate实现轻量级消息队列的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友


  • springboot中如何替换class文件

    发布:2023-04-02

    这篇文章主要介绍了springboot中如何替换class文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Springboot项目平滑关闭及自动化关闭脚本详解

    发布:2020-02-04

    这篇文章主要为大家详细介绍了Springboot项目平滑关闭及自动化关闭脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • SpringBoot之HandlerInterceptor拦截器的使用详解

    发布:2022-04-05

    这篇文章主要介绍了SpringBoot之HandlerInterceptor拦截器的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • SpringCloud实现SSO单点登录的用法及实例

    发布:2019-09-05

    作为分布式项目,单点登录是必不可少的,这篇文章主要介绍了SpringCloud实现SSO 单点登录的示例代码,非常具有实用价值,需要的朋友可以参考下


  • springcloud gateway网关服务启动报错的解决

    springcloud gateway网关服务启动报错的解决

    发布:2022-06-22

    给网友们整理关于springcloud的教程,这篇文章主要介绍了springcloud gateway网关服务启动报错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • IntelliJ IDEA2022.3 springboot 热部署含静态文件(最新推荐)

    发布:2023-04-21

    这篇文章主要介绍了IntelliJ IDEA2022.3 springboot 热部署含静态文件,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


网友讨论