我的问题是我有应用程序,它使用Spring配置文件。在服务器上构建应用程序意味着配置文件设置为“wo-data-init
”。对于其他版本,有“test
”个人资料。当它们中的任何一个被激活时,它们不应该运行Bean方法,所以我虽然这个注释应该可以工作:
@Profile({"!test","!wo-data-init"})
似乎更像是在运行if(!test OR !wo-data-init)
而在我的情况下我需要它来运行if(!test AND !wo-data-init)
- 它甚至可能吗?
答案 0 :(得分:9)
Spring 4为conditional bean creation带来了一些很酷的功能。在您的情况下,确实纯@Profile
注释是不够的,因为它使用OR
运算符。
您可以执行的解决方案之一是为其创建自定义注释和自定义条件。例如
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(NoProfilesEnabledCondition.class)
public @interface NoProfilesEnabled {
String[] value();
}
public class NoProfilesEnabledCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
boolean matches = true;
if (context.getEnvironment() != null) {
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(NoProfileEnabled.class.getName());
if (attrs != null) {
for (Object value : attrs.get("value")) {
String[] requiredProfiles = (String[]) value;
for (String profile : requiredProfiles) {
if (context.getEnvironment().acceptsProfiles(profile)) {
matches = false;
}
}
}
}
}
return matches;
}
}
以上是ProfileCondition的快速而肮脏的修改。
现在您可以通过以下方式注释您的bean:
@Component
@NoProfilesEnabled({"foo", "bar"})
class ProjectRepositoryImpl implements ProjectRepository { ... }
答案 1 :(得分:0)
我找到了更好的解决方案
@Profile("default")
配置文件默认表示没有foo和栏配置文件。
答案 2 :(得分:0)
在Spring 5.1(Spring Boot 2.1)及更高版本中,它很简单:
@Component
@Profile("!a & !b")
public class MyComponent {}
参考:How to conditionally declare Bean when multiple profiles are not active?