@Conditional注解实现条件注入

SpringBoot中,更多的是使用已经高度开发的一系列条件注解,第一次接触Spring的条件注解,没想到还需要写实现类。

1
2
3
4
5
6
7
8
9

@Conditional({
    WindowCondition.class
})
@Bean
public XXX xxx(){
    return new XXX();
}

Condition的实现类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

public class WindowCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        /*
            conditionContext:判断条件能使用的上下文(环境)
            annotatedTypeMetadata:注释信息
         */

        // 获取到ioc使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();

        // 获取类加载器
        ClassLoader classLoader = conditionContext.getClassLoader();

        // 获取当前环境信息
        Environment environment = conditionContext.getEnvironment();

        // 获取到bean定义的注册类(我以为会通过这个类注入Bean,看样子是我想多了)
        //      支持定义一个Bean
        //      支持移除一个bean
        BeanDefinitionRegistry registry = conditionContext.getRegistry();

        return false;
    }
}

我们也可以手动指定os.name:


-Dos.name=linux