@Conditional注解如何在春天中使用

  介绍

@Conditional注解如何在春天中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>前言:

@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

@Conditional的定义:

//此注解可以标注在类和方法上   @Target ({ElementType.TYPE, ElementType.METHOD})   @Retention (RetentionPolicy.RUNTIME),   @Documented   public  @interface  Conditional  {   ,,Class<? extends  Condition>[],价值();   }

从代码中可以看的到,需要传入一个类数组,并且需要继承条件接口:

public  interface  Condition  {   boolean 才能匹配(ConditionContext  var1, AnnotatedTypeMetadata  var2);   }

条件是个接口,需要实现匹配方法,返回正确则注入bean,错误则不注入。

<强>示例:

首先,创建人类:

public  class  Person  {   ,   private 才能;String 名称;   private 才能;Integer 年龄;   ,   public 才能;String  getName (), {   ,,,return 名称;   ,,}   ,   public 才能;void  setName (String 名称),{   ,,,this.name =,名称;   ,,}   ,   public 才能;Integer  getAge (), {   ,,,return 年龄;   ,,}   ,   public 才能;void  setAge (Integer 年龄),{   ,,,this.age =,年龄;   ,,}   ,   public 才能;人(名字,String  Integer 年龄),{   ,,,this.name =,名称;   ,,,this.age =,年龄;   ,,}   ,   @Override才能   public 才能;String  toString (), {   ,,,return “人{,,+,“name=& # 39;“, +, name  +, & # 39; \ & # 39; & # 39;, +,,,,岁=?+,age  +, & # 39;} & # 39;;   ,,}   }

创建BeanConfig类,用于配置两个人实例并注入,一个是比尔盖茨,一个是林纳斯。

@ configuration   public  class  BeanConfig  {   ,   @ bean才能(=name “bill")   public 才能;Person  person1 () {   ,,,return  new 人(“Bill  Gates" 62);   ,,}   ,   @ bean才能(“linus")   public 才能;Person  person2 () {   ,,,return  new 人(“Linus" 48);   ,,}   }

接着写一个测试类进行验证这两个Bean是否注入成功。

public  class  ConditionalTest  {   ,   AnnotationConfigApplicationContext 才能;applicationContext =, new 所(BeanConfig.class);   ,   @Test才能   public 才能;void  test1 () {   ,,,Map<字符串,Person>, map =, applicationContext.getBeansOfType (Person.class);   ,,,System.out.println(地图);   ,,}   }

运行,输出结果是这样的,两个人实例被注入进容器。

 @Conditional注解如何在春天中使用“> </p> <p>这是一个简单的例子,现在问题来了,如果我想<强>根据当前操作系统来注入人实例</>强,windows下注入账单,linux下注入李纳斯,怎么实现呢? </p> <p>这就需要我们用到@Conditional注解了,前言中提到,需要实现条件接口,并重写方法来自定义匹配规则。</p> <p>首先,创建一个WindowsCondition类:</p> <pre类= public  class  WindowsCondition  implements  Condition  {   ,   ,/* *   ,,*,@param  conditionContext:判断条件能使用的上下文环境   ,,*,@param  annotatedTypeMetadata:注解所在位置的注释信息   ,,*,*/@Override才能   public 才能;boolean 匹配(ConditionContext  conditionContext, AnnotatedTypeMetadata  annotatedTypeMetadata), {   ,,,//获取奥委会使用的beanFactory   ,,,ConfigurableListableBeanFactory  beanFactory =, conditionContext.getBeanFactory ();   ,,,//获取类加载器   ,,,ClassLoader  ClassLoader =, conditionContext.getClassLoader ();   ,,,//获取当前环境信息   ,,,Environment  Environment =, conditionContext.getEnvironment ();   ,,,//获取豆定义的注册类   ,,,BeanDefinitionRegistry  registry =, conditionContext.getRegistry ();   ,   ,,,//获得当前系统名   ,,,String  property =, environment.getProperty (“os.name");   ,,,//包含窗户则说明是Windows系统,返回现实   ,,,if  (property.contains (“Windows")) {   ,,,,,return 真实;   ,,,}   ,,,return 假;   ,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

@Conditional注解如何在春天中使用