首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SpringBoot基础篇Bean之@ConditionalOnBean与@ConditionalOnClass

除了前面一篇博文中介绍的通过@Conditional注解配合Condition接口的实现之外,还提供了更多简化的注解使用方式,省略了自己实现Condtion接口,本篇博文主要介绍下面几个常用的注解使用方式 @ConditionalOnBean...@ConditionalOnBean 要求bean存在时,才会创建这个bean;如我提供了一个bean名为RedisOperBean,用于封装redis相关的操作;但是我这个bean需要依赖restTemplate...这个bean,只有当应用引入了redis的相关依赖,并存在RestTemplate这个bean的时候,我这个bean才会生效 假设bean的定义如下 @Component @ConditionalOnBean...Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(OnBeanCondition.class) public @interface ConditionalOnBean...DependedBean(); } /** * 只有当DependedBean 存在时,才会创建bean: `LoadIfBeanExist` * * @return */ @Bean @ConditionalOnBean

17.1K23
您找到你想要的搜索结果了吗?
是的
没有找到

为什么@Conditional会失效?

@ConditionalOnBean:当容器中存在指定的 Bean 时,条件才会成立。 @ConditionalOnMissingBean:当容器中不存在指定的 Bean 时,条件才会成立。...我们选择@ConditionalOnBean为例,分析一下springboot条件注解的视线原理,看一下@ConditionalOnBean实现: @Target({ ElementType.TYPE,...)) { Spec spec = new Spec(context, metadata, annotations, ConditionalOnBean.class...五、解决方案 想要解决上述问题,要保证配置类的解析和加载在依赖类之后,也就是使用@ConditionalOnBean注解的类的条件判定和注册必须要在依赖的类之后,可以参考一下方案。...注解的 @Bean 方法移到自动装配类中,这样就可以保证自动装配类中的 Bean 先被加载和注册,满足 @ConditionalOnBean 的条件要求。

37020

SpringBoot自动装配源码笔记

1.1.1 @ConditionalOnBean @ConditionalOnBean注解的作用是当注解参数对应的bean不存在时,则其标注的Bean也不会被注册。...此时再运行一下项目 此时发现user bean不存在(因为@Bean注解已经被注释掉了),并且book bean也不存在(@ConditionalOnBean注解的作用) 扩展: 使用@ConditionalOnBean...但这是如果调换一下两个bean的声明顺序,如下 此时得到如下结果: 可以看到book bean不能被创建,因为它是从上往下顺序注册到容器的的,在注册book时user bean还没被注册,@ConditionalOnBean...1.1.2 @ConditionalOnMissingBean 作用和@ConditionalOnBean相反 1.2. 配置绑定 1.2.1....这里打开CacheAutoConfiguration类查看 可以看到这里使用了@ConditionalOnClass,@ConditionalOnBean,@ConditionalOnMissingBean

24020

助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

同时是OnBeanCondition是@ConditionalOnBean,@ConditionalOnSingleCandidate和ConditionalOnMissingBean的条件类。...注解的情况 if (metadata.isAnnotated(ConditionalOnBean.class.getName())) { // 将@ConditionalOnBean注解属性封装进...BeanSearchSpec对象中 // 注意BeanSearchSpec是一个静态内部类,用来存储@ConditionalOnBean和@ConditionalOnMissingBean注解的属性值...BeanSearchSpec spec = new BeanSearchSpec(context, metadata, ConditionalOnBean.class); //...现在我们只看针对@ConditionalOnBean注解的处理逻辑,从上面代码中可以看到若配置类(metadata)标注@ConditionalOnBean注解的话,主要做了以下事情: 将该注解属性提取出来封装进

1.2K00
领券