俩个作用:根据当前环境或者容器情况来动态注入bean,要配合@Bean使用
@ConditionalOnMissingBean作用:判断当前需要注入Spring容器中的bean的实现类是否已经含有,有的话不注入,没有就注入
@ConditionalOnBean作用:判断当前需要注册的bean的实现类否被spring管理,如果被管理则注入,反之不注入
@ConditionalOnMissingBean和@ConditionalOnBean
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {
Class<?>[] value() default {};
String[] type() default {};
Class<? extends Annotation>[] annotation() default {};
String[] name() default {};
SearchStrategy search() default SearchStrategy.ALL;
Class<?>[] parameterizedContainer() default {};
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnMissingBean {
Class<?>[] value() default {};
String[] type() default {};
Class<?>[] ignored() default {};
String[] ignoredType() default {};
Class<? extends Annotation>[] annotation() default {};
String[] name() default {};
SearchStrategy search() default SearchStrategy.ALL;
Class<?>[] parameterizedContainer() default {};
可以发现@ConditionalOnMissingBean和@ConditionalOnBean俩个注解的动态注入条件判断类都是OnBeanCondition,并且都是基于@Conditional注解。
@Conditional具体可以去看 @Conditional注解使用与自定义验证注解 这篇文章
OnBeanCondition:
@Order(2147483647)
class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
...具体内容可以看代码
OnBeanCondition没有直接实现matches方法,而是使用的FilteringSpringBootCondition的父类SpringBootCondition类中的matches方法。
-
创建接口Animal
public interface Animal {
String eat();
-
分别创建俩个实现类
public class Dog implements Animal {
@Override
public String eat() {
return "肉";
public class Cat implements Animal {
@Override
public String eat() {
return "老鼠";
-
创建俩个配置类
@Configuration
public class CatConfig {
@Bean
public Animal animal() {
return new Cat();
@Configuration
public class DogConfig {
@Bean
public Animal animal() {
return new Cat();
-
测试类
@SpringBootApplication
public class ServiceDiscoverApplication implements CommandLineRunner {
@Autowired
private Animal animal;
public static void main(String[] args) {
SpringApplication.run(ServiceDiscoverApplication.class, args);
@Override
public void run(String... args) throws Exception {
String eat = animal.eat();
System.out.println(eat);
@Configuration
public class CatConfig {
@Bean
@ConditionalOnMissingBean
public Animal animal() {
return new Cat();
运行程序:控制台输出为 '肉' 当在DogConfig中添加@ConditionalOnMissingBean注解,运行结果为 '老鼠'
如果当前容器中含有Animal类型的bean,那么就不加载带有@ConditionalOnMissingBean注解的Animal类型bean到spring的ioc容器。
-
@ConditionalOnBean
修改Cat类,去掉@Service,不让spring管理
public class Cat implements Animal {
@Override
public String eat() {
return "老鼠";
修改CatConfig类,在CatConfig中添加@ConditionalOnBean注解
@Configuration
public class CatConfig {
@Bean
@ConditionalOnBean(Cat.class)
public Animal animal() {
return new Cat();
运行程序:控制台输出为 '肉' 当在DogConfig中添加@ConditionalOnBean(Dog.class)注解、去掉@Service注解时,运行结果为 '老鼠'
当bean Animal的实现类没有被spring所管理,那么就不会加载带有@ConditionalOnBean注解的bean到spring的ioc容器。
Spring的注解中,@ConditionalOnBean和@ConditionalOnMissingBean有什么区别?
@ConditionalOnBean和@ConditionalOnMissingBean均是@Conditional的派生注解,来给Bean的注入增加一些前提条件:
@Conditional是自定义注入的条件
@ConditionalOnBean是依赖某些Bean才能注入的条件
@ConditionalOnBean是排斥某Bean才能注入的条件
具体如下:
浏览器打开
继@Conditional注解后,又基于此注解推出了很多派生注解,比如@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnExpression、@ConditionalOnClass…动态注入bean变得更方便了。本篇将讲解@ConditionalOnMissingBean注解。
做了一个功能接口提供给消费者实现,考虑到有些消费者没有实现接口,就会导致报错。所以需要写一个默认实现,并且在消费者有实现接口时,采用消费者的接口。
浏览器打开
@Bean的作用是将该组件注入到容器中
@ConditionalOnBean 当容器中存在这个类型组件,才进行组件注入
@ConditionalOnMissingBean 当容器中没有这个组件时,才注入组件
这三个注解经常标在方法上,进行组件注入
接下来代码演示一下这三个注解的基本使用
先来一个最基本的实体类
@AllArgsConstructor
@Data //lombok注解,简化set get,重点不是这个插件
public class Computer {
private String
浏览器打开
1、@Conditional
按照条件注入Bean
1、实现Condition接口并按自己的逻辑返回true /false ,返回true最后Bea会注入,否则相反
@Configuration
public class BeanConfig {
//只有一个类时,大括号可以省略
//如果WindowsCondition的实现方法返回true,则注入这个bean
@Conditional({WindowsCondition.class})
@Bean(name =
浏览器打开
@ConditionalOnMissingBean 注解的作用详解
@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉人员。
@Component
public class AutoConfig {
@Bean
public AConfig aConfig() {
return
浏览器打开
Spring4推出了@Conditional注解,方便程序根据当前环境或者容器情况来动态注入bean,对@Conditional注解不熟悉的朋友可移步至 Spring @Conditional注解 详细讲解及示例 这篇博客进行学习。
继@Conditional注解后,又基于此注解推出了很多派生注解,比如@ConditionalOnBean、@ConditionalOnMissingBe...
浏览器打开
问题描述最新负责的工程在做dubbo配置disconf静态配置托管优化,由一个StaticConfigPropertiesFactoryBean来读取静态配置,它是PropertiesFactoryBean的一个子类,读取到的所有配置放在一个Properties中。
dubbo配置直接引用这个Properties的值。像下面这样,dubbo接口的group通过disconf的静态配置项dubb
浏览器打开
@ConditionalOnMissingBean注解作用在@bean定义上,它的作用就是在容器加载它作用的bean时,检查容器中是否存在目标类型(ConditionalOnMissingBean注解的value值)的bean了,如果存在这跳过原始bean的BeanDefinition加载动作。
转载于:https://www.cnblogs.com/shamo89/p/78501...
浏览器打开
1、@ConditionalOnMissingBean
@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个。
如果不加@ConditionalOnMissingBean,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员。
package ljxwtl.cn.bean;
import org.springframework.con
浏览器打开
文章目录为啥要学习@ConditionalOnBean@ConditionalOnMissingBean测试再来讲@ConditionalOnBean源码分析原文作者
为啥要学习@ConditionalOnBean
在学习springboot自动装配的时候发现有用到@Conditional@ConditionalOnBean注解,当时只是了解大概,平常用的不多,但是后来想了解一下,看到网上有详解了...
浏览器打开
之前看到这篇博客,写ConditionalOnClass的用法,自己实践了一下,感觉有点问题,原文如下:
https://blog.csdn.net/lucyTheSlayer/article/details/80430912
于是自己更正了一下,代码结构如下:
贴上完整的代码:
程序入口:ConditionalDemoApplication:
@Spri...
浏览器打开
在学习SpringBoot时,遇到@EnableWebMvc注解:
(1)EnableWebMvc的核心,引入了DelegatingWebMvcConfiguration实例;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
(2)而 D...
浏览器打开
我们都知道@ConditionalOnBean作用是根据value属性按bean的类型或则bean的名称判断bean是否在IOC容器中,如果在就返回true,否则返回false。而@ConditionalOnMissingBean的作用与@ConditionalOnBean相反。
但是如果@ConditionalOnBean和@ConditionalOnMissingBean这两个注解没有入参...
浏览器打开
SpringBoot中的自动配置类有很多ConditionalOnClass注解,@ConditionalOnClass在注解值中所有的类都存在时(通过尝试使用类加载器加载指定的类的方式判断)才会匹配,那么它们都是有哪些作用呢?
@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
@ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
@ConditionalOnClass //.
浏览器打开
@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
@ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
@ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
@ConditionalOnMissingClass // 当给定的类名在
浏览器打开