SpringBoot中的@ConditionalOnMissingBean注解使用详解

 更新时间:2024年01月24日 10:02:07   作者:Java小白笔记  
这篇文章主要介绍了SpringBoot中的@ConditionalOnMissingBean注解使用详解,@ConditionalOnMissingBean作用在@Bean定义上,也就是说在容器加载它作用的Bean时,检查容器中是否存在目标类型,需要的朋友可以参考下

@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实例–》如果有实例,拿系统创建的实例;如果没有这个实例,返回一个我预先定义的一个实例,这样别的服务启动就就不会报错

image-20220902142154009

image-20220902143335229

==center中的Feign实现定义的BaseAccountService

image-20220902143503312

别的服务只需要加上@EnableFeignClients这个注解就可以扫描的到Center中的Feign

image-20220902143903348

==使用@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() );
          }
      };
    }
}

到此这篇关于SpringBoot中的@ConditionalOnMissingBean注解使用详解的文章就介绍到这了,更多相关@ConditionalOnMissingBean注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java缓存框架之Caffeine源码解析

    Java缓存框架之Caffeine源码解析

    这篇文章主要介绍了Java缓存框架之Caffeine源码解析,Caffeine 是一个基于Java 8的高性能本地缓存框架,其结构和 Guava Cache 基本一样,api也一样,基本上很容易就能替换,需要的朋友可以参考下
    2023-11-11
  • SpringBoot常见错误图文总结

    SpringBoot常见错误图文总结

    最近在使用idea+Springboot开发项目中遇到一些问题,这篇文章主要给大家介绍了关于SpringBoot常见错误总结的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java泛型T,E,K,V,N,?与Object区别和含义

    Java泛型T,E,K,V,N,?与Object区别和含义

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。本文将详细讲讲Java泛型T、E、K、V、N、?和Object区别和含义,需要发可以参考一下
    2022-03-03
  • java设计模式:原始模型模式

    java设计模式:原始模型模式

    这篇文章主要为大家详细介绍了Java设计模式之Prototype原型模式的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • spring boot实战之本地jar包引用示例

    spring boot实战之本地jar包引用示例

    本篇文章主要介绍了spring boot实战之本地jar包引用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • java按钮控件数组实现计算器界面示例分享

    java按钮控件数组实现计算器界面示例分享

    本文主要介绍了JAVA通过按钮数组来管理界面中的所有按钮控件,从而使用最少的代码实现模拟的计算器界面
    2014-02-02
  • Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)

    Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)

    这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下
    2021-04-04
  • Fastjson反序列化随机性失败示例详解

    Fastjson反序列化随机性失败示例详解

    这篇文章主要为大家介绍了Fastjson反序列化随机性失败示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 深度解析Spring AI请求与响应机制的核心逻辑

    深度解析Spring AI请求与响应机制的核心逻辑

    我们在前面的两个章节中基本上对Spring Boot 3版本的新变化进行了全面的回顾,以确保在接下来研究Spring AI时能够避免任何潜在的问题,本文给大家介绍Spring AI请求与响应机制的核心逻辑,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • java实现图片上插入文字并保存

    java实现图片上插入文字并保存

    这篇文章主要为大家详细介绍了java实现图片上插入文字并保存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论