Spring - @Conditional

@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容器中去

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118066545