在上一篇有说到,进行源码跟踪时可以看见一个以@Conditional开头的注解,这些都是条件装配的注解。
加在方法上时只对该方法生效,加在类上时是对整个配置类都有效。
这里只说三个常用的@Conditional的子注解
案例演示
在启动类上加上一个@EnableHeatherConfi注解,这个注解底层是第三方依赖包准备的一个配置类
@ConditionalOnClass
如图加上这个注解之后再加上一个全类名指定查找(com.itheima.controller.DeptController)这个类,springboot会自动判断是否存在一个这样的类,只有存在了才会将headerParser这个Bean对象注册到IOC容器当中.
然后在单元测试类当中尝试获取这个类的Bean对象,如图所示成功获取到这个Bean对象。
然后再改一改name属性,改成不存在的一个全类名之后再尝试获取,结果如下所示
报错说不存在HeaderParser这个Bean对象
@ConditionalOnMissingBean
如果是什么value都没有,这个注解判断的就是自身这个Bean是否存在于环境,如果不存在就加入IOC容器中。
这里也可以根据指定的Bean类型或者名称来进行判断。
单元测试尝试获取这个Bean,成功获取,另外的两种这里不再演示
@ConditionalOnProperty
如下所示会自动判断在项目的配置文件中是否存在一个属性名为“name”,属性值为“itheima”的配置项
在配置文件中如下,不存在需要的东西。
直接在测试单元尝试获取Bean对象输出如下,无法获取这个Bean对象。 在配置文件加上需要的属性值和属性之后再次获取就可以正常获取到的
使用场景:在使用第三方依赖的时候有时会需要声明很多配置项才能使用,比如mybatis就需要用户名密码和url等等。
总结
在前面提到的google提供的处理json的一个类Gson如下所示
在其配置类上面有一个@ConditionalOnClass注解判断当前文件是否存在Gson.class这个字节码文件,有才会把当前配置类加载到IOC容器。
在Gson上还有一个@ConditionalOnMissingBean这个注解,表示环境下有当前类型的Bean对象时才会使用用户自定义的这个Bean,没有的话会把当前的Bean对象注册到IOC容器当中。
自动配置原理梳理