springboot的自动配置02–
演示这4个条件注解
属性条件注解 @ConditionalOnProperty、
Web条件注解 @ConditionalOnWebApplication、
表达式条件注解 @ConditionalOnExpression
特殊条件注解 @ConditionalOnJava
springboot最核心的就是条件注解,真正属于springboot的注解。
而之前的那些 @Controller、@RestController、@PathVariable @Bean 这些其实不属于springboot本身,其实是属于spring mvc,都是属于spring的框架本身
条件注解的理解:该注解指定了一些条件,只有符合这些条件,被该注解修饰的类或方法才能生效。
这些条件可以是yml配置文件里面的属性等数据是否存在,也可以是一些依赖驱动是否存在的条件、也可以是指定的bean是否存在、也可以是java版本是否是指定的版本等条件。
条件注解分类:
类条件注解:
@ConditionalOnClass、
@ConditionalOnMissingClass
Bean条件注解:
@ConditionalOnMissingBean、
@ConditionalOnSingleCandidate
@ConditionalOnBean
@ConditionalOnMissingFilterBean
属性条件注解:@ConditionalOnProperty
资源条件注解:@ConditionalOnResource
Web应用条件注解:
@ConditionalOnWebApplication.
@ConditionalOnNotWebApplication.
@ConditionalOnWarDeployment
SpEL表达式条件注解:
@ConditionalOnExpression
特殊条件注解:
@ConditionalOnCloudPlatform、
@ConditionalOnJava、
@ConditionalOnJndi.
@ConditionalOnRepositorylype
@ConditionalOnProperty
@ConditionalOnProperty注解用于检查特定的配置属性是否具有指定的属性值。该注解支持如下属性:
就是用来检查配置文件比如 yml ,里面的配置属性是否有我们指定要的属性值。
- String[] value:指定要检查的属性。
- String[] name:value属性的别名。
- String havingValue:指定被检查属性必须具有的属性值。
如果将havingValue设置为" " 空字符串,这样只要给被检查的属性设置了非false的属性值,那么它都可以通过检查。
- String prefix:自动为各属性名添加该属性指定的前缀。
- boolean matchIfMissing:指定当属性未设置属性值时,是否通过检查。
创建一个配置类,然后创建一个 bean ,在这个bean上贴上注解@ConditionalOnProperty(name = “me”,prefix = “java.springboot”,havingValue = “我爱学习JAVA”)。
作用是 要求检查配置文件(如 yml )中的 java.springboot.me 属性,要求该属性的值必须为 “我爱学习”,这个配置方法才能生效,也就是这个bean才能在项目启动的时候被加载生效。
用来检测配置文件中是否有某些属性和值,有才让这个bean生效。这个就是属性条件注解。
havingValue不写,只留空字符串,也可以通过属性检测。
配置文件的属性值写成false,那么也不能该bean也不能生效。
@ConditionalOnResource注解的作用很简单,它要求指定的资源必须存在,该注解修饰的配置类或方法才会生效;
使用该注解只需指定resources属性,该属性指定必须存在的资源。
@ConditionalOnWebApplication
▲ @ConditionalOnWebApplication要求当前应用必须是Web应用时,它所修饰的配置类或方法才会生效。
使用该注解时可通过type属性指定Web应用的类型。
▲ @ConditionalOnNotWebApplication则要求当前应用不是Web应用时,该注解修饰的配置类或方法才会生效。
▲ @ConditionalOnWarDeployment要求当前应用以传统WAR包方式部署到Web服务器或应用服务器中(不以独立Java程序的方式运行),
该注解修饰的配置类或方法才会生效。
//要求只有当该应用是Web应用的时候,这个bean才生效。
//type 属性支持 ANY / SERVLET / REACTIVE 这三个枚举值,其中 SERVLET / REACTIVE是不同类型的web应用,其中 ANY 是默认值
// ANY -- 当前应用只要是个 Web 应用 ,都可以生效。
// SERVLET -- 我们这个项目的应用就是传统的 SERVLET 的 Web 应用
// REACTIVE -- 当前Web应用必须是 反应式Web应用(WebFlux 就是反应式应用) ,这个bean才能生效
//目前我们的项目是普通的 spring MVC 的Web 应用,也就是 servlet 应用,所以 type 为 REACTIVE ,这个bean就不会生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
如图:依赖是普通的 servlet 的web应用,而注解指定的是 reactive 反应式web应用,所以这个bean不生效
把依赖改成 reactive 反应式 web 应用,这个bean就可以生效。
@ConditionalOnExpression
@ConditionalOnExpression 注解则要求指定 Sp EL表达式 的值为true,这样该注解修饰的配置类或方法才会生效。
sp el 就是spring 的el 表达式,可以在spring容器内实时查询和操作数据,尤其是操作List列表型、Array数组型数据。
简单理解就是可以拿值,比如普通的调用bean的数据
代码演示:
创建一个user对象,添加两个属性值。
然后再配置类中创建一个 user 的bean对象交给spring容器管理,然后返回的user对象中的enable属性值设置为true。
在使用表达式注解的时候,因为user.enable ,调用的enable的值为true,所以下面的myDateFormat这个bean配置才会生效。
如果在user这个bean的返回值中把enable的值设置成false,那么下面的 myDateFormat这个bean就不会生效
@ConditionalOnJava
@ConditionalOnCloudPlatform注解则要求应用被部署在特定云平台上,这样该注解修饰的配置类或方法才会生效。
该注解可通过value属性指定它所要求的云平台,value属性值也是特定枚举值,不同枚举值代表了不同的云平台。
@ConditionalOnJava注解则对目标平台的Java版本进行检测,该注解既可要求目标平台的Java是某个具体的版本,
也可要求大于或小于某个版本。
@ConditionalOnJndi注解要求指定JNDI必须存在,使用该注解时要通过value属性指定要检查的JNDI。
@ConditionalOnRepositoryType注解要求特定的Spring Data Repository被启用时,该注解修饰的配置类或方法才会生效。
代码演示:
演示项目是jdk8,但是这个@ConditionalOnJava注解要求java的jdk得是11或是比11更高的版本,所以这个bean配置不生效。