@Conditional是Spring4新提供的注解,它的作用是根据某个条件创建特定的Bean,通过实现条件接口,并重写比赛接口来构造判断条件。总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置。
本文将分为三大部分,@Conditional源码的介绍,条件的使用示例和@Conditional的扩展注解的介绍。
@Target({应用。类型,ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) @Documented @ interface公共条件{/* * *所有}{@link条件条件,必须{# @linkplain条件匹配匹配} *为了组件注册。 */Class<& # 63;扩展Condition>[]值(); }
从源码中可以看的到,@Conditional注解可以用在类和方法上,需要传入一个实现了条件接口类数组。
下面将以不同的操作系统为条件,通过实现条件接口,并重写其匹配方法来构造判断条件。若在Windows系统下运行程序,则输出列表命令为dir;若在Linux系统下运行程序,则输出列表命令为ls。
<强> 1。判断条件类的定义
强>
(1)。判断Windows的条件
包com.study.day01; 进口org.springframework.context.annotation.Condition; 进口org.springframework.context.annotation.ConditionContext; 进口org.springframework.core.type.AnnotatedTypeMetadata;/* * * @Auther: lifq * @Description: */公共类WindowsCondition实现条件{ 公共布尔匹配(ConditionContext上下文,AnnotatedTypeMetadata元数据){ 返回context.getEnvironment () . getproperty (os.name) .contains(“窗口”); } }
(2)。判断Linux的条件
包com.study.day01; 进口org.springframework.context.annotation.Condition; 进口org.springframework.context.annotation.ConditionContext; 进口org.springframework.core.type.AnnotatedTypeMetadata;/* * * @Auther: lifq * @Description: */公共类LinuxCondition实现条件{ 公共布尔匹配(ConditionContext上下文,AnnotatedTypeMetadata元数据){ 返回context.getEnvironment () . getproperty (os.name) .contains (“Linux”); } }
<强> 2。不同系统下的Bean的类强>
(1)。接口代码
包com.study.day01; 进口org.springframework.stereotype.Service;/* * * @Auther: lifq * @Description: */公共接口ListService { 公共字符串showListCmd (); }
(2) .Windows实现类代码
包com.study.day01;/* * * @Auther: lifq * @Description: */公共类WindowsService实现ListService { 公共字符串showListCmd () { 返回“dir”; } }
(3) .Linux实现类代码
包com.study.day01;/* * * @Auther: lifq * @Description: */公共类LinuxService实现ListService { 公共字符串showListCmd () { 返回“ls”; } }
<强> 3。配置类强>
包com.study.day01; 进口org.springframework.context.annotation.Bean; 进口org.springframework.context.annotation.Conditional; 进口org.springframework.context.annotation.Configuration;/* * * @Auther: lifq * @Description: */@ configuration 公共类配置{ @ bean @Conditional (WindowsCondition.class) 公共ListService窗口(){ 返回新WindowsService (); } @ bean @Conditional (LinuxCondition.class) 公共ListService linux () { 返回新LinuxService (); } }
<>强4。运行类强>
包com.study.day01; 进口org.springframework.context.annotation.AnnotationConfigApplicationContext;/* * * @Auther: lifq * @Description: */公开课Main01 { 公共静态void main (String [] args) { 所applicationContext=new所(Config.class); ListService ListService=applicationContext.getBean (ListService.class); System.out.println (applicationContext.getEnvironment () . getproperty (“os.name”) +”系统下的列表命令为:" + listService.showListCmd ()); } }弹簧条件注解@Conditional示例详解