Spring源码分析(五)-注解@Conditional条件注册bean
发布时间:2022-12-05 20:22:06 281 相关标签: # java# spring# linux# 容器# 信息
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环境:


文章来源: https://blog.51cto.com/u_14906615/5899337
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报