Spring Profile批注允许您选择配置文件。但是,如果您阅读文档,它仅允许您使用OR操作选择多个配置文件。如果指定@Profile(“ A”,“ B”),则在配置文件A或配置文件B处于活动状态时,您的bean都将启动。
我们的用例不同,我们要支持多种配置的TEST和PROD版本。因此,有时我们只想在概要文件TEST和CONFIG1都处于活动状态时才自动装配bean。
Spring有什么办法吗?最简单的方法是什么?
因为Spring没有开箱即用的AND功能。我建议以下策略:
当前@Profile
注释具有条件注释@Conditional(ProfileCondition.class)
。在ProfileCondition.class
其中循环访问概要文件,并检查概要文件是否处于活动状态。同样,您可以创建自己的条件实现并限制注册Bean。例如
public class MyProfileCondition implements Condition {
@Override
public boolean matches(final ConditionContext context,
final AnnotatedTypeMetadata metadata) {
if (context.getEnvironment() != null) {
final MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
if (attrs != null) {
for (final Object value : attrs.get("value")) {
final String activeProfiles = context.getEnvironment().getProperty("spring.profiles.active");
for (final String profile : (String[]) value) {
if (!activeProfiles.contains(profile)) {
return false;
}
}
}
return true;
}
}
return true;
}
}
在您的课程中:
@Component
@Profile("dev")
@Conditional(value = { MyProfileCondition.class })
public class DevDatasourceConfig
注意:我没有检查所有的极端情况(例如null,长度检查等)。但是,这个方向可能会有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句