Spring注解驱动开发 第四节Conditional根据条件注册bean

Spring注解驱动开发 第四节Conditional根据条件注册bean
@Configuration
public class MainConfig2 {
    /**
     * @see
     *     ConfigurableBeanFactory#SCOPE_PROTOTYPE
     * 	@see ConfigurableBeanFactory#SCOPE_SINGLETON
     * 	@see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
     * 	@see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
     */
    //@Scope("prototype")
    //@Lazy
    @Bean
    public Person person(){
        System.out.println("person类被初始化了...");
        return new Person("张三","27");
    }

    /**
     * Conditional:按照一定的条件进行判断,满足条件给容器中注册bean
     * 如果系统是linux就给容器注册林纳斯,
     * 如果系统是windows就给容器注册比尔盖茨.
     * @return
     */
    @Conditional({WindowsCondition.class})
    @Bean
    public Person bill(){
        return new Person("比尔盖茨","60");
    }
    @Conditional({LinuxCondtition.class})
    @Bean
    public Person linus(){
        return new Person("林纳斯","50");
    }
}

首先先在配置类中注入两个bean,一个windows,一个linux。

/**
 * 判断操作系统是否windows
 */
public class WindowsCondition implements Condition {
    //ConditionContext 判断条件能使用的上下文环境
    //AnnotatedTypeMetadata 获取当前标注了Conditional注解的注释信息
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //可以获取当前ioc使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        //获取类加载器
        ClassLoader classLoader = context.getClassLoader();
        //获取上下文环境变量
        Environment environment = context.getEnvironment();
        //获取bean定义系统,可以用它注册bean,移除bean
        BeanDefinitionRegistry registry = context.getRegistry();
        String systemName = environment.getProperty("os.name");
        if (systemName.contains("Windows")) {
            return true;
        }
        return false;
    }
}
/**
 * 判断操作系统是否linux
 */
public class LinuxCondtition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //获取上下文环境变量
        Environment environment = context.getEnvironment();
        if(environment.getProperty("os.name").contains("linux")){
            return true;
        }
        return false;
    }
}

上面的两个是根据当前环境的上下文判断向spring容器注入哪个bean,代码片段中有详细注释各个方法的作用。

ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
    @Test
    public void test03(){
        String[] names = context.getBeanNamesForType(Person.class);
        for(String name : names){
            System.out.println(name);
        }
        Map<String,Person> map = context.getBeansOfType(Person.class);
        System.out.println(map);
    }

获取当前spring容器中类型为person的所有id名称,并获取当前spring容器中person类型的所有详细数据信息。

运行打印结果:

四月 22, 2019 4:50:12 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Mon Apr 22 16:50:12 GMT+08:00 2019]; root of context hierarchy
person类被初始化了...
person
bill
{person=Person{name='张三', age='27'}, bill=Person{name='比尔盖茨', age='60'}}

Process finished with exit code 0

可以看出由于当前系统是windows,所以比尔盖茨被注册到spring容器中

然后我们修改java虚拟机参数,将其设置为linux。
在这里插入图片描述
然后再次运行,打印结果:

四月 22, 2019 4:52:28 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Mon Apr 22 16:52:28 GMT+08:00 2019]; root of context hierarchy
person类被初始化了...
person
linus
{person=Person{name='张三', age='27'}, linus=Person{name='林纳斯', age='50'}}

Process finished with exit code 0

可以看出林纳斯被注册到spring容器中。
如果@Conditional被注册在类上,就表示复核当前条件的话,person,linux,windows都被注册到spring容器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值