返回

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环境:

Spring源码分析(五)-注解@Conditional条件注册bean_spring

Spring源码分析(五)-注解@Conditional条件注册bean_java_02

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线