Day14-09.SpringBoot原理-自动配置-原理分析-@Conditional
(1)@Conditional
1、作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到SpringIOC容器中。
2、位置:方法(只是针对当前方法声明的bean有效)、类(对整个配置类都有效)
3、@Condition本身是一个父注解,派生出大量的子注解
①:@ConditionalOnClass:判断环境中是否有对应字节码文件,如果当前环境引入了对应的jar包,有对应的字节码文件,才注册bean到IOC容器
②:@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),如果没有对应的bean,才会注册bean到IOC容器
③:@ConditionProperty:判断配置文件中有对应属性和值,如果有,才会注册bean到IOC容器
(2)三个常用注解
①:注解一@ConditionalOnClass
判断当前环境中是否存在指定的字节码文件或者指定的类,如果这个类存在才会声明对应的bean对象
如果有对应的字节码文件:
如果没有对应的字节码文件:
只要我们在pom.xml文件中引入了对应的依赖,这个bean自动就配置好了,我们不需要做任何操作。如果我们没有引入对应的以阿里,这个bean也不会自动配置好。
②:注解二@ConditionalOnMissingBean
这个注解的应用场景通常都是用来设置一个默认的bean对象,什么是默认的bean对象呢?默认的bean对象是指如果用户在引入我们这个依赖之后自己定义了这个类型的bean,此时就用它自己定义的,默认的这个就不会生效。如果没有自己定义,然后还想使用这个类型的bean的话,此时就使用我们提供的这个默认的bean就可以了。
③:注解三@ConditionProperty
这个条件注解和配置文件中配置的属性有关系,name指定的是配置文件中配置项的名字,havingValue指定的是配置文件中配置项的值。比如这里指定配置项的名字为name,值为itheima。此时就代表他会自动的去判断当前环境的配置文件当中是否存在指定的属性和值,如果存在,才会将该bean假如到IOC容器中。
如果有对应的属性和值:
如果没有对应的属性和值:
这个注解的使用场景也比较多,比如我们在SpringBoot当中整合一些其他第三方技术的时候,我们只有在对应的配置文件中配置了对应配置项才会声明对应的bean对象。
(3)总结
(4)回顾SpringBoot自动配置原理
SpringBoot自动配置的原理:
SpringBoot自动配置的原理核心就在@SpringBootApplication这个注解上,这个注解底层包含了三个注解,分别是SpringBootConfiguration、ComponentScan和最为核心的@EnableAutoConfiguration。Enable开头的注解底层就封装了@Import注解,@Import注解里面指定了一个类,是ImportSelector这个接口的实现类,这个实现类需要去重写ImportSelector这个接口里面的selectImports方法,这个方法的返回值代表的就是我需要将哪些类交给Spring的IOC容器管理。此时会去读取两份配置文件,一份是spring.factories,另一份是AutoConfiguration.imports。而在AutoConfiguration.imports这份文件当中他就会去配置大量的自动配置的类。前面提到过,这些所有的自动配置类中所有的bean都会加载到Spring的IOC容器当中吗?不是!!因为这些配置类在声明Bean 的时候通常会加上Condition开头的注解,这个注解就是进行条件装配的。所以SpringBoot非常智能,他会根据Condition注解来进行条件装配,只有条件成立他才会声明这个bean,才会将这个bean交给IOC容器管理。
,他会根据Condition注解来进行条件装配,只有条件成立他才会声明这个bean,才会将这个bean交给IOC容器管理。