Conditional条件注册bean
假设有这么一个场景,需要根据操作系统加载不同的实例
将IOC容器注册bean时, 当操作系统为WINDOWS时,注册caojiulu实例; 当操作系统为LINUX时, 注册hujinxiao实例,此时要用得@Conditional注解进行定制化条件选择注册bean
新建Cap5MainConfig.java
package com.caojiulu.cap5.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import com.caojiulu.cap1.bean.Person;
import com.caojiulu.cap5.condition.LinuxCondition;
import com.caojiulu.cap5.condition.WinConditin;
@Configuration
public class Cap5MainConfig {
@Conditional({WinConditin.class})
@Bean
public Person caojiulu(){
return new Person("caojiulu",20);
}
@Conditional({LinuxCondition.class})
@Bean
public Person huinxiao(){
return new Person("huinxiao",28);
}
}
新建WinConditin.java
package com.caojiulu.cap5.condition;
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 WinConditin implements Condition{
/**
* ConditionContext :上下文环境
* AnnotatedTypeMetadata : 注释信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//是否window系统
//获取beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//获取类加载器
ResourceLoader resourceLoader = context.getResourceLoader();
//获取环境信息
Environment environment = context.getEnvironment();
//获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
if(property.contains("Windows")){
return true;
}
return false;
}
}
新建LinuxCondition.java
package com.caojiulu.cap5.condition;
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 LinuxCondition implements Condition{
/**
* ConditionContext :上下文环境
* AnnotatedTypeMetadata : 注释信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//是否window系统
//获取beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//获取类加载器
ResourceLoader resourceLoader = context.getResourceLoader();
//获取环境信息
Environment environment = context.getEnvironment();
//获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
if(property.contains("linux")){
return true;
}
return false;
}
}
测试类:
模拟linux环境: