Spring注解驱动开发——组件注册 @Conditional按照条件注册bean

@Conditional

spring4.0之后添加的功能,按照一定的条件进行判断,满足条件注册bean

 

场景:2个Bean按照 Conditional 条件看注入或者不住入

复制代码
    @Bean
    public Person Bill(){
        return new Person("Bill Gates",67);
    }
    
    @Conditional(value=LinuxCondition.class)
    @Bean
    public Person linus(){
        return new Person("linus",67);
    }
复制代码

场景:Conditional 条件:windows系统下注入Bill  linux系统下注入linus

windows: 判断的实现类

复制代码
package com.mongoubiubiu.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.type.AnnotatedTypeMetadata;
/**
 * 判断是否是Windows系统
 * @author 86138
 *
 */
public class WindowCondition implements Condition {
    
    
    
    /**
     * ConditionContext 判断条件能使用的上下文(环境)
     * AnnotatedTypeMetadata 标记Condition 注解的注释信息
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        //能获取到ioc 当前使用的bean工厂
        ConfigurableListableBeanFactory config=    context.getBeanFactory();
        
        //获取到类加载器
        ClassLoader classLoader = context.getClassLoader();
        
        //获取到运行时环境
        Environment environment=context.getEnvironment();
        
        //获取到bean定义的注册类
        BeanDefinitionRegistry registry=context.getRegistry();
        String osName=environment.getProperty("os.name");
        if(osName.equals("Windows 10")){
            System.out.println("进入了判断");
            return true;
        }
    
           return false;
    }

}
复制代码

Linux: 判断的实现类

复制代码
package com.mongoubiubiu.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.type.AnnotatedTypeMetadata;

public class LinuxCondition implements Condition{

    
    /**
     * ConditionContext 判断条件能使用的上下文(环境)
     * AnnotatedTypeMetadata 标记Condition 注解的注释信息
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        //能获取到ioc 当前使用的bean工厂
        ConfigurableListableBeanFactory config=    context.getBeanFactory();
        
        //获取到类加载器
        ClassLoader classLoader = context.getClassLoader();
        
        //获取到运行时环境
        Environment environment=context.getEnvironment();
        
        //获取到bean定义的注册类
        BeanDefinitionRegistry registry=context.getRegistry();
        String osName=environment.getProperty("os.name");
        if(osName.equals("linux")){
            System.out.println("进入了判断");
            return true;
        }
    
           return false;
    }
}
复制代码

 

 

 

标在方法上

Junit测试Windows

 

 

 

输出

 

 

 

 

 

 

linus 确实没有注入

测试linux

 

复制代码
    
    @Test
    public void test03(){
        Environment en=    applica.getEnvironment();
        String [] af=applica.getBeanNamesForType(Person.class);
        for (String string : af) {
            System.out.println(string);
        }
        Map<String, Person>  map= applica.getBeansOfType(Person.class);
        Environment environment=applica.getEnvironment();
        String property=environment.getProperty("os.name");
        
    //    System.out.println(property);
        
    //    System.out.println(map.toString());
        
    }
复制代码

 

只注入了linus 生效

 

标在类上

 

 而目前是linux   条件是windows 才创建对象放入容器

Junit测试

复制代码
@Test
    public void test03(){
        Environment en=    applica.getEnvironment();
        String [] af=applica.getBeanNamesForType(Person.class);
        for (String string : af) {
            System.out.println(string);
        }
        Map<String, Person>  map= applica.getBeansOfType(Person.class);
        Environment environment=applica.getEnvironment();
        String property=environment.getProperty("os.name");
        
       System.out.println(property);
        
        System.out.println(map.toString());
        
    }
复制代码

测试 发现一个都没有

 

本文作者:KwFruit

本文链接:https://www.cnblogs.com/mangoubiubiu/p/15059384.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KwFruit  阅读(47)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起