是否可以以一种不会被一组概要文件使用的方式配置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而是在另一个注释上粘贴注释吗?
@Primary
本质上,我想要这样:
@Profile("!(dev, prof1, prof2)")
提前致谢!
简短的答案是:您不能。 但是,由于有了@Conditional注释,所以存在一种巧妙的解决方法。
@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。