SpringBoot – @ConditionalOnMissingBean注解使用详解
说明:
@ConditionalOnMissingBean是用于修饰Bean的一个注解,在项目启动时开始自动化配置注册生成Bean,当某个类型的Bean被注册之后,如果再注册相同类型的Bean就会失败,该注解会保证Spring容器中只有一个Bean类型的实例,当注册多个相同类型的Bean时,会出现异常。
当一个接口有多个实现类时,如果只希望它有一个实现类,那就在其他的各个实现类上加上这个注解。
@ConditionalOnMissingBean作用在@Bean定义上,也就是说在容器加载它作用的Bean时,检查容器中是否存在目标类型(@ConditionalOnMissingBean注解的value值)的Bean了,如果存在则跳过Bean的默认加载动作,如果不存在则加载该Bean完成注册。
@ConditionalOnBean有则注入;
@ConditionalOnMissBean没有则注入;
@Conditional条件满足则注入。
- @ConditionalOnMissingBean注解只作用在@Bean定义的方法上
- 建议仅仅在自动配置类中使用此注解,虽然放在其他类中也不会报错
- 该注解仅能匹配已经被当前应用上下文管控的Bean定义
- 若候选Bean是被其他配置类创建的,需要使用@AutoConfigureBefore 或@AutoConfigureOrder进行配置类先后注入顺序的控制,确保这个条件在其后运行
- Condition相关的处理是在包扫描的时候执行的,因此Bean的添加顺序和包扫描的顺序有关,而包扫描的顺序依赖包名和类名的字符排序,同时和maven的pom文件中包引入的顺序也有关系,先引入的包先被扫描到,所以在实际的项目中,我们可以修改类路径或者调整包引入顺序来调整Bean的添加顺序
代码实例
为什么要用这个注解?
1、center,task,videoAccess依赖于common,center中有根据用户id获取信息的Feign接口
2、在common中有一个AOP方法是统一获取用户信息的
3、实现这个功能方法有2种:
(1)可以在common中直直接引用Center中的feign接口,center可以正常启动,别的服务会报注入的Feign会找不到,那这样就影响到别的服务了呀,这个问题需要解决
(2)所以common中定义了一个公共BaseAccountService接口,
流程是:spring启动–》加载feign实例–》如果有实例,拿系统创建的实例;如果没有这个实例,返回一个我预先定义的一个实例,这样别的服务启动就就不会报错
==center中的Feign实现定义的BaseAccountService
别的服务只需要加上@EnableFeignClients这个注解就可以扫描的到Center中的Feign
==使用@ConditionalOnMissingBean(value = {BaseAccountService.class})这个注解处理
@Configuration
public class BaseAccountServiceBeanMissConfig {
@Bean
@ConditionalOnMissingBean(value = {BaseAccountService.class})
public BaseAccountService getNewBaseAccountBean() {
return new BaseAccountService(){
@Override
public Result<AccountInfoResponse> queryAccountDetails(Long userId) {
return new Result<AccountInfoResponse>(new AccountInfoResponse() );
}
};
}
}
参考文章:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118656.html