天天看點

SpringBoot中Condition注解條件的使用擷取配置檔案内容

**

SpringBoot中Condition注解條件的使用

**

小編的場景是:想根據Linux和Windows不同環境而注入不同的Bean

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.net.InetAddress;
import java.net.UnknownHostException;


public class LinuxCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    	//1、能擷取到ioc使用的beanfactory
		ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
		//2、擷取類加載器
		ClassLoader classLoader = context.getClassLoader();
		//3、擷取目前環境資訊
		Environment environment = context.getEnvironment();
		//4、擷取到bean定義的注冊類
		BeanDefinitionRegistry registry = context.getRegistry();
		
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        //此處也可以擷取到配置檔案的資訊,比如擷取配置檔案中的端口
        String port = environment.getProperty("server.port");
        
        //若果系統是linux 并且 啟動端口是8080則允許注入bean
		if(property.contains("Linux") && port.equals("8080")){
            return true;
        }
        return false;
    }
}
           

使用方法: 此處以配置為例, 在win10本地啟動不注入Bean

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;


//類中元件統一設定。滿足目前條件,這個類中配置的所有bean注冊才能生效;
//也可以加在方法上。此時隻有這個加了條件的Bean滿足條件才會注入。
@Conditional({LinuxCondition.class})
@Configuration
public class MainConfig {

	@Conditional({LinuxCondition.class})
    @Bean
    public ExtraWork ExtraWork(){
        return new ExtraWork();
    }
    
	@Bean
    public LocalWork LocalWork(){
        return new LocalWork();
    }
    
}
           

繼續閱讀