@ConditionalOnMissingBean注解

@ConditionalOnMissingBean,它是修饰bean的一个注解。
主要实现的是,当你的bean被注册之后,如果再注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员。抛出的异常如图:

使用方法

该注解的用法如下:

1
2
3
4
@ConditionalOnMissingBean
@ConditionalOnMissingBean(TransactionManager.class)
@ConditionalOnMissingBean(ignored = {DistributedCommandBus.class})
@ConditionalOnMissingBean({EventStorageEngine.class,EventBus.class, EventStore.class})

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component public class AutoConfig{ 
@Bean
public AConfig aConfig(){
return new AConfig("lind");
}

@Bean
@ConditionalOnMissingBean(AMapper.class)
public AMapper aMapper1(AConfig aConfig){
return new AMapperImpl1(aConfig);
}

@Bean
public AMapper aMapper2(AConfig aConfig){
return new AMapperImpl2(aConfig);
}
}

以上这段代码运行起来就会抛异常,因为在aapper1中使用了注解@ConditionalOnMissingBean并表明了注入的类是 AMapper.class,而下面还有一个返回是 AMapper 的Bean。这就会抛出异常,因为注解是不允许有多个返回同样类型的Bean存在。

当我们把 @ConditionalOnMissingBean(AMapper.class) 去掉之后,bean可以注册多次,那么我注入的Bean会是什么?这个时候可以使用@AutoWried注解和@Qualifier来指定一个Bean来实现注入。

但是如果不使用这两个注解的话,这时需要用的@Primary来确定你要哪个实现;一般来说,对于自定义的配置类,我们应该加上@ConditionalOnMissingBean注解,以避免多个配置同时注入的风险。

1
2
3
4
5
6
7
8
9
10
@Bean 
public AMapper aMapper1(AConfig aConfig) {
return new AMapperImpl1(aConfig);
}

@Bean
@Primary
public AMapper aMapper2(AConfig aConfig) {
return new AMapperImpl2(aConfig);
}

这样就可以来明显的区分注入的时候会优先选择哪一个了。