bean不通过beanName的方式做ConditionalOnMissingBean,可以使用自定义注解结合@Conditional注解实现。
1. 创建自定义注解,如@ConditionalOnMissingMyBean。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnMissingMyBeanCondition.class)
public @interface ConditionalOnMissingMyBean {
String[] value() default {};
Class<?>[] type() default {};
}
2. 创建注解处理类OnMissingMyBeanCondition,并实现Condition接口的matches方法。
public class OnMissingMyBeanCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Map<String, Object> attributes = metadata.getAnnotationAttributes(ConditionalOnMissingMyBean.class.getName());
String[] beanNames = (String[]) attributes.get("value");
Class<?>[] types = (Class<?>[]) attributes.get("type");
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
BeanDefinitionRegistry registry = context.getRegistry();
for (Class<?> type : types) {
if (beanFactory.getBeanNamesForType(type).length > 0) {
return false;
}
}
for (String beanName : beanNames) {
if (registry.containsBeanDefinition(beanName)) {
return false;
}
}
return true;
}
}
3. 在需要使用@ConditionalOnMissingMyBean注解的地方使用该注解即可。
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
@Bean
@ConditionalOnMissingMyBean(type = MyBean.class)
public MyAnotherBean myAnotherBean() {
return new MyAnotherBean();
}
}
总结:这样,当MyBean存在时,MyAnotherBean就不会被创建;反之,当MyBean不存在时,MyAnotherBean就会被创建。