一尘不染

我可以否定(!)Spring轮廓集合吗?

spring-boot

是否可以以一种不会被一组概要文件使用的方式配置bean?目前,我可以做到这一点(我相信):

@Profile("!dev, !qa, !local")

是否有更整洁的符号来实现这一目标?假设我有很多个人资料。另外,如果我有某些服务(或其他服务)的Mock和具体实现,是否可以仅对其中之一进行注释,并假设在其他所有情况下都可以使用其他服务?换句话说,例如,这是否必要:

@Profile("dev, prof1, prof2")
public class MockImp implements MyInterface {...}

@Profile("!dev, !prof1, !prof2") //assume for argument sake that there are many other profiles
public class RealImp implements MyInterface {...}

我可以注释其中一个,@Primary而是在另一个注释上粘贴注释吗?

本质上,我想要这样:

@Profile("!(dev, prof1, prof2)")

提前致谢!


阅读 278

收藏
2020-05-30

共1个答案

一尘不染

简短的答案是:您不能。
但是,由于有了@Conditional注释,所以存在一种巧妙的解决方法。

创建条件匹配器:

public abstract class ProfileCondition extends SpringBootCondition {
    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        if (matchProfiles(conditionContext.getEnvironment())) {
            return ConditionOutcome.match("A local profile has been found.");
        }
        return ConditionOutcome.noMatch("No local profiles found.");
    }

    protected abstract boolean matchProfiles(final Environment environment);
}

public class DevProfileCondition extends ProfileCondition {
   private boolean matchProfiles(final Environment environment) {    
        return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> {
            return prof.equals("dev") || prof.equals("prof1")) || prof.equals("prof2"));
        });
    }
}

public class ProdProfileCondition extends ProfileCondition {
   private boolean matchProfiles(final Environment environment) {    
        return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> {
            return !prof.equals("dev") && !prof.equals("prof1")) && !prof.equals("prof2"));
        });
    }
}

用它

@Conditional(value = {DevProfileCondition.class})
public class MockImpl implements MyInterface {...}

@Conditional(value = {ProdProfileCondition.class})
public class RealImp implements MyInterface {...}

但是,此方法需要Springboot。

2020-05-30