@ConditionalOnBean在Spring中如何与预选赛一起使用?
以下是独立的示例场景:我有
@绿色预选赛:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Green { }
@Blue限定词:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Blue { }
绿色服务:
@Green
@Service
@ConditionalOnBean(value = SomeAdapter.class, annotation = Green.class)
public class GreenService implements SomeService {
@Autowired
@Green
private SomeAdapter adapter;
}
BlueService:
@Blue
@Service
@ConditionalOnBean(value = SomeAdapter.class, annotation = Blue.class)
public class BlueService implements SomeService {
@Autowired
@Blue
private SomeAdapter adapter;
}
绿色适配器:
@Green
@Component
public class GreenAdapter implements SomeAdapter {}
BlueAdapter:
@Blue
@Component
public class BlueAdapter implements SomeAdapter {}
测试以检查Bean的激活情况(不包含BlueAdapter,因此BlueService不会处于活动状态):
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {GreenService.class, BlueService.class, GreenAdapter.class})
public class GreenBlueServiceTest {
@Autowired
@Green
private Optional<SomeService> greenService;
@Autowired
@Blue
private Optional<SomeService> blueService;
@Test
public void testGreen() {
assertTrue(greenService.isPresent());
}
@Test
public void testBlue() {
assertFalse(blueService.isPresent());
}
}
问题:测试将无法运行,报告一个丢失的依赖(SomeAdapter有资格@Blue的BlueService)。的@ConditionalOnBean,因为没有应禁用豆SomeAdapter与资格赛@Blue,但这并没有工作。
我发现,当我向中添加@TrueBlue注释(与@Blue,但未标记为@Annotation)并在上BlueAdapter使用该注释进行Bean激活时BlueService,它的工作原理与预期的一样(测试所有绿色)。
结论:
问题来源:Stack Overflow
请注意@ConditionalOnBean文档说:
All the requirements must be met for the condition to match, but they do not have to be met by the same bean. `
注意说的部分 but they do not have to be met by the same bean.
如果存在类型中的任何豆SomeAdapter加上任何带注释的豆,则下面的条件将匹配@Blue
@ConditionalOnBean(value = SomeAdapter.class, annotation = Blue.class)
因此,当你有BlueService豆标注有@Blue你也有GreenAdapter这是一个SomeAdapter.class条件通过。它欺骗我们以为它只会与SomeAdapter带有@Blue注释的匹配。
为了使您的示例正常工作,只需@Blue从中删除注释BlueService
问题来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。