弹簧条件注解@Conditional示例详解

  

  

@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示例详解