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注解完成条件注入的主要内容,如果未能解决你的问题,请参考以下文章
Lab: Blind SQL injection with conditional responses PRACTITIONER 带条件响应的SQL盲注靶场复盘