020 使用@Conditional注解完成条件注入

Posted 最爱五仁月饼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了020 使用@Conditional注解完成条件注入相关的知识,希望对你有一定的参考价值。

一 .概述

在spring之中提供@Conditional注解完成条件注入.

我们可以实现特定的接口,完成配置类可以根据条件进行Bean的创建.


 二 .测试

public abstract class OS {
    protected String name;
    
    public String getName() {
        return this.name;
    }
}

class Windows extends OS {
    public  Windows() {
         super.name = "windows";
    }
    
}

class Linux extends OS {
    public Linux() {
        super.name = "linux";
    }
}

配置类:

@Configuration
public class ConditionalConfig {
    
    @Bean//只用条件成立才会创建对象
    @Conditional(WindowsConditonal.class)
    public OS windows() {
        return new Windows();
    }
    
    @Bean
    @Conditional(LinuxConditional.class)
    public OS linux() {
        return new Linux();
    }
}

两个条件类:

public class AbstractConditional {
    
    public String getOSName(ConditionContext context) {
        Environment environment = context.getEnvironment();
        String osName = environment.getProperty("os.name");
        return osName;
    }
}
public class WindowsConditonal extends AbstractConditional implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if(super.getOSName(context).toUpperCase().contains("WINDOWS")) {
            return true;
        }
        return false;
    }

}
public class LinuxConditional  extends AbstractConditional implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if(super.getOSName(context).toUpperCase().contains("LINUX")) {
            return true;
        }
        return false;
    }

}

只有当当前的操作系统为windows时,才会注入该bean.

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {ConditionalConfig.class})
public class ConditionalTest {
    
    @Autowired
    private ApplicationContext context;
    
    @Test
    public void test() {
        System.out.println(context.getBean(OS.class).getName());
    }
}

结果返回为window,说明在当前的操作系统中只能创建一个Bean,另外一个Bean的声明并不会执行,否则getBean()方法会出现问题.

 

以上是关于020 使用@Conditional注解完成条件注入的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot条件注解@Conditional

Lab: Blind SQL injection with conditional responses PRACTITIONER 带条件响应的SQL盲注靶场复盘

Spring---条件注解@Conditional

条件注解@Conditional

Spring Boot 条件注解

Spring Boot 条件注解