SpringBoot-基础-09-条件注解

条件注解@Conditional

再Spring中基本所有的延申类条件注解都是基于@Conditional进行拓展的,通过此注解能够限制配置类或者某个指定的@Bean是否生效(是否需要注入)

注解定义在类上(一般指定Configuration配置类),用于判断该类是否生效
和@Bean配合使用时,用于判断该bean是否需要注入

一、Condition接口

@Conditional注解的属性是一个Condition接口实现类的Class数组,每一个Condition实现类都相当于一个条件,只有当全部条件为true,才会生效或是注入。
其中Condition接口实现类需要实现matchs方法,条件满足返回true,否则返回false

二、示例

创建接口和对应实现类,显示当前系统用于测试

public interface SysService {
    void show();
}
public class LinuxService  implements SysService {
    @Override
    public void show() {
        System.out.println("我是linux");
    }
}
public class WindowsService implements SysService {
    @Override
    public void show() {
        System.out.println("我是Window");
    }
}

创建Condition实现类,在match方法中约定条件判断规则,此类中将条件为真判定为系统名字包含“Linux”

public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String sysName = context.getEnvironment().getProperty("os.name");
        if (sysName.contains("Linux")) {
            return true;
        }
        return false;
    }

}

创建Condition实现类,在match方法中约定条件判断规则,此类中将条件为真判定为系统名字包含“Windows”

public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context,
                           AnnotatedTypeMetadata metadata) {
        String sysName = context.getEnvironment().getProperty("os.name");
        if (sysName.contains("Windows")) {
            return true;
        }
        return false;
    }

}

将@Bean和@Conditional组合使用,实现Bean注入,本次测试环境为Windows系统,因此只有WindowsService的Bean注入成功。

@Configuration
public class ConditionConfig {
    @Bean
    @Conditional(WindowsCondition.class) // 1如果是wind系统创建对应的bean
    public SysService windowsListService() {
        return new WindowsService();
    }

    @Bean
    @Conditional(LinuxCondition.class) // 2如果是Linux系统创建对应的bean
    public SysService linuxListService() {
        return new LinuxService();
    }

}

通过测试类,查看注入成功的Bean

public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);


        SysService sysService = context.getBean(SysService.class);

        String sysName = context.getEnvironment().getProperty("os.name");
        System.out.println("当前的操作系统是:"+sysName);

        System.out.println("------------------------------------");
        sysService.show();

    }

}

测试结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值