@Conditional注解的作用是条件判断注解,特点是可以给方法注解,也可以给整个类注解,表示满足条件才可以执行
使用示例:
下面的代码是其中一个案例: 编写条件类DemoCondition
注释部分是条件判断的示例,判断操作系统是否为Linux
package config;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class DemoCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取ioc容器使用的beanFactory
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//获取当前环境(java运行环境所在的环境)
Environment environment = conditionContext.getEnvironment();//
//获取定义bean的注册类
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//获取资源加载器
ResourceLoader resourceLoader = conditionContext.getResourceLoader();
/*
String property = environment.getProperty("os.name");
if (property.contains("Linux")){
System.out.println("输出信息:==>"+property);
return true;
}
*/
//默认返回false,前面通过获取到的信息进行if条件判断,符合则return true
return false;
}
}
使用方法:给想要判断的方法 或者 类加上条件注解@Conditional
如下:spring配置类
package config;
import bean.HelloWorld;
import org.springframework.context.annotation.*;
@Configuration
public class Config {
// @Scope("prototype")
@Conditional({DemoCondition.class})
@Bean("hello")
public HelloWorld hello() {
System.out.println("bean加入ioc容器");
return new HelloWorld();
}
}
测试类:运行测试案例前将前面的条件类注释去掉
package config;
import bean.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.junit.Assert.*;
public class ConfigTest {
@Test
public void test1(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
HelloWorld hello = (HelloWorld) applicationContext.getBean("hello");
}
}
运行过程:如果不去掉注释可能会报错,原因是返回了false,条件不成立自然就不会加入ioc容器。如果用的是Windows则将Linux改成Windows