浅谈关于spring profile的误解

2025-05-29 0 97

背景

springprofile大家都是用的溜的飞起~

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

比如我们这样使用

?

1
@profile({"prod", "unit-test"})

分析

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

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

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

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

?

1
@profile({"!prod"})

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

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

?

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

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

我们看一下对应的代码

代码

profile是通过profilecondition来完成控制的

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
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

?

1

2

3

4

5

6

7

8

9

10

11

12

13
/**

* 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的条件

当然代码如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
@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

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

?

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://my.oschina.net/qixiaobo025/blog/1927580

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 浅谈关于spring profile的误解 https://www.kuaiidc.com/110941.html

相关文章

发表评论
暂无评论