Java Spring:使用@Qualifier()-限定bean(如果可用),否则使用任意
我正在尝试创建一个组件,该组件将接受一个bean(Java Spring:使用@Qualifier()-限定bean(如果可用),否则使用任意,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试创建一个组件,该组件将接受一个bean(fasterxmlObjectMapper) 如果有一个名为qualifiedObjectMapper的限定bean,我想使用该bean 如果没有具有该名称的bean,但有一个ObjectMapperbean,我想使用它 据我所知,如果我这样做: class MyClass( @Qualified("qualifiedObjectMapper") objectMapper: ObjectMapper ) 只有当有一个bean具有该名称时,它
fasterxml
ObjectMapper
)
如果有一个名为qualifiedObjectMapper
的限定bean,我想使用该bean
如果没有具有该名称的bean,但有一个ObjectMapper
bean,我想使用它
据我所知,如果我这样做:
class MyClass(
@Qualified("qualifiedObjectMapper") objectMapper: ObjectMapper
)
只有当有一个bean具有该名称时,它才会工作,但如果没有,它就不会使用另一个ObjectMapper
bean(如果有多个,则使用主bean)
有没有办法使用限定的,如果它存在的话,或者使用主要的?试试这个
@Autowired
private ApplicationContext applicationContext;
@Autowired
private ObjectMapper objectMapper;
然后
try {
ObjectMapper obj = applicationContext.getBean("qualifiedObjectMapper");
//use qualifier
}catch(Exception e) {
//use objectMapper
}
为此,您可以使用
@Configuration
类,在该类中,您可以基于主bean和可选bean创建另一个合格bean:
@Configuration
class Config {
@Primary @Bean
ObjectMapper primary() {...}
@Bean
ObjectMapper qualified(){...}
@Bean
ObjectMapper resulted(ObjectMapper primary,
@Autowired(required = false) @Qualifier("qualified") ObjectMapper qualified){
return qualified == null ? primary : qualified;
}
}
并将结果bean用作:
@Service
class MyService {
MyService(@Qualifier("resulted") ObjectMapper mapper) {...}
}
您是否有权使用XML(
primary=“true”
)或Java注释@primary
将限定对象映射器标记为主映射器?可能,但在这种情况下,它不一定是主映射器。它可能是一个仅用于此目的的辅助程序,而主程序则在整个应用程序中使用。我真的不想使用applicationContext.getBean(“”
)。虽然它在技术上可行,但使用它也有很多缺点。(请注意,我不是那个被否决的人……这不是我想要的,但这不是个坏主意。)