Spring注解开发(三)——@Conditional(SpringBoot底层大量使用到的注解)

 

目录

标注在方法上

标注在类上


@Conditional :按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解

@Conditional 可以标注在类上或者方法上

package com.cjian.config;

import com.cjian.bean.Person;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.WindowsCondition;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 9:32
 */
@Configuration //告诉spring这是一个配置类
//指定要扫描的包,以及不扫描哪些组件
@ComponentScans(value = {
    @ComponentScan(value = "com.cjian")
})
public class MainConfig {


    @Bean("person")
    public Person person01() {
        return new Person("cjian", 27);
    }

    //@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
    //模拟:windows环境下输出Bill,linux下输出linus
    @Conditional({WindowsCondition.class})
    @Bean("Bill")
    public Person person02() {
        return new Person("Bill gates", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person03() {
        return new Person("linus", 48);
    }
}
package com.cjian.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;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 18:42
 */
public class LinuxCondition implements Condition {

    /*
    * ConditionContext conditionContext :判断条件能使用的上下文(环境)
    * AnnotatedTypeMetadata annotatedTypeMetadata :注释信息
    * */
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //能获取到ioc使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        //获取当前环境信息
        Environment environment = conditionContext.getEnvironment();
        //获取类加载器
        ClassLoader classLoader = conditionContext.getClassLoader();
        //获取到bean定义的注册类
        BeanDefinitionRegistry registry = conditionContext.getRegistry();
        //判断容器中是否有id 为person 的 bean,也可以给容器中注册bean(后面说)
        boolean flag = registry.containsBeanDefinition("person");

        String property = environment.getProperty("os.name");

        if(property.contains("linux")){
            return true;
        }

        return false;
    }
}
package com.cjian.condition;

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

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 18:42
 */
public class WindowsCondition  implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //获取当前环境信息
        Environment environment = conditionContext.getEnvironment();
        String property = environment.getProperty("os.name");
        if(property.contains("Windows")){
            return true;
        }
        return false;
    }
}

测试代码:

标注在方法上

package com.cjian;

import com.cjian.bean.Person;
import com.cjian.config.MainConfig;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.util.Map;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 9:44
 */
public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            MainConfig.class);
        ConfigurableEnvironment environment = annotationConfigApplicationContext.getEnvironment();
        //获取环境变量的值
        String property = environment.getProperty("os.name");
        System.out.println("当前系统:"+property);

        String[] beanNamesForType = annotationConfigApplicationContext.getBeanNamesForType(Person.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
        Map<String, Person> persons = annotationConfigApplicationContext.getBeansOfType(Person.class);
        System.out.println(persons);

    }


}

输出:

当前系统:Windows 10
person
Bill
{person=Person{name='cjian', age=27}, Bill=Person{name='Bill gates', age=62}}

模拟linux环境:

-Dos.name=linux

输出:

当前系统:linux
person
linus
{person=Person{name='cjian', age=27}, linus=Person{name='linus', age=48}}

 

标注在类上

只有满足条件,该类的所有配置才会注册到ioc中

package com.cjian.config;

import com.cjian.bean.Person;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.WindowsCondition;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 9:32
 */
@Configuration //告诉spring这是一个配置类
//指定要扫描的包,以及不扫描哪些组件
@ComponentScans(value = {
    @ComponentScan(value = "com.cjian")
})
@Conditional({WindowsCondition.class})
public class MainConfig {


    @Bean("person")
    public Person person01() {
        return new Person("cjian", 27);
    }

    //@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解

    @Bean("Bill")
    public Person person02() {
        return new Person("Bill gates", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person03() {
        return new Person("linus", 48);
    }
}

输出:

当前系统:Windows 10
person
Bill
{person=Person{name='cjian', age=27}, Bill=Person{name='Bill gates', age=62}}

如果将 @Conditional({LinuxCondition.class}) 注释掉,linus也会注册到ioc中

 

模拟linux,输出:

当前系统:linux
{}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值