Spring - @Conditional

本文介绍如何使用Spring的@Conditional注解根据系统环境动态注册Bean。通过WindowsCondition和LinuxCondition,当系统为Windows时加载Bill,Linux时加载Linus,展示了条件注解的强大功能。
摘要由CSDN通过智能技术生成

@Conditional

按照一定的条件向Spring的IOC容器中注册,不满足条件就不向容器中注册Bean。@Conditional注解接受一个实现org.springframework.context.annotation.Condition的数组

定义两个Person,一个Bill,一个Linus,分别加上@Conditional注解,然后加上各自的condition

//告诉Spring这是一个配置文件
@Configuration
public class SpringConfig4 {

    @Conditional({WindowsCondition.class})
    @Bean(name = "bill")//给容器中注册一个bean
    public Person getPerson01() {
        return new Person("bill", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean(name = "linus")//给容器中注册一个bean
    public Person getPerson02() {
        return new Person("linus", 89);
    }
}

分别实现WindowsCondition和LinuxCondition。判断条件很简单,判断当前系统的 “os” 属性是LINUX还是WINDOWS

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


public class LinuxCondition implements Condition {

    /**
     * @param context  判断上下文使用的环境
     * @param metadata 注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String systemName = context.getEnvironment().getProperty("os").toUpperCase();
        if (systemName.contains("LINUX"))
            return true;
        return false;
    }
}

从Spring的IOC容器中获取Person实例

    @Test
    public void testAnnotation5() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig4.class);
        String os = context.getEnvironment().getProperty("os");
        System.out.println("当前系统---->" + os);
        Map<String, Person> map = context.getBeansOfType(Person.class);
        map.keySet().forEach(key -> {
            Person person = map.get(key);
            System.out.println(key + "-->" + person.toString());
        });
    }

随着我们切换系统的 “os” 的属性,我们就能发现注册到Spring的IOC容器中额Person实例也会不一样。当我们把系统的 "os" 修改成windows的时候,Person的实例为:bill,当我们把 "os" 修改成 linux 后,Person实例就变成了:linus

"os" 等于 "windows"

当前系统---->windows
bill-->Person{name='bill', age=62}

"os" 等于 "linux"

当前系统---->linux
linus-->Person{name='linus', age=89}

 

@Conditionanl注解不仅可以添加在方法上,还可以添加到被@Configuration注解的类上,意思就是满足@Conditional中的Condition的条件,当前配置文件中定义的Bean才会被实例化到Spring的IOC容器中去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值