@Conditional注解使用

 

前言

       当一个接口有多个实现类时,启动spring容器根据条件来加载其中的某一个作为实现类,应该如何实现呢?

其实这种情况对于策略模式很有效,下面来看一下如何具体实现。

 

DEMO

 

1、定义一个接口

 

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public interface EncodingConvert {
  
}

 

2、定义2个实现类

 

    其一:

 

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public class GBKEncodingConvert implements EncodingConvert {

}

      

      其二:

   

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public class UTFEncodingConvert implements  EncodingConvert {
}

 

  

3、定义配置类

 

@SpringBootConfiguration
public class EncodingConfig {

    @Bean
    @Conditional(UTFCondition.class)
    public EncodingConvert createUTF(){
        return  new UTFEncodingConvert();
    }

    @Bean
    @Conditional({GBKCondition.class})
    public EncodingConvert createGBK(){
        return  new GBKEncodingConvert();
    }


}

4、定义Condition(返回true则加载)

 

    其一:

 

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class GBKCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String encoding= System.getProperty("file.encoding");
        if(encoding!=null){
            return "gbk".equals(encoding.toLowerCase());
        }
        return false;
    }
}

     

     其二:

  

public class UTFCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String encoding= System.getProperty("file.encoding");
        if(encoding!=null){
            return "utf".equals(encoding.toLowerCase());
        }
        return false;
    }
}

 

 

说明:

       配置类中添加了@Conditional的注解,说明在加载这个方法的时候,需要去判断相应的Condition(条件),如果返回true,则运行此方法。同样@Conditional也可以放在类上面,是同样的道理(则对其下所有方法都适用)。

 

      注意:@Conditional可以传递多个参数:@Conditional({UTFCondition.class, GBKCondition.class})

 

 

推荐一个公众号,免费领架构师学习资料,每周更新优质文章,能学到很多。

@Conditional注解使用_第1张图片

你可能感兴趣的:(……Spring)