spring注解 @Conditional的使用

@Conditional:根据条件,注入bean的实例,标注在类上,表示对配置类所有成员生效

我们先看@Conditional注解的定义,这里的value,需要传入Condition的接口的实现

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

	/**
	 * All {@link Condition}s that must {@linkplain Condition#matches match}
	 * in order for the component to be registered.
	 */
	Class<? extends Condition>[] value();

}

创建一个MyCondition 实现Condition接口

public class MyCondition implements Condition {

    /**
     * ConditionContext:判断条件能使用的上下文(环境)
     * AnnotatedTypeMetadata:注释信息
     */
    @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();
        // 取到运行环境的信息
        String property = environment.getProperty("os.name");

        // 4、获取到bean定义的注册类,可以查看类的定义信息,如是否单例,是否懒加载等,详细查看BeanDefinitionRegistry的接口定义
        BeanDefinitionRegistry registry = context.getRegistry();
        // 可以判断容器中的bean注册情况,也可以给容器中注册bean
        boolean definition = registry.containsBeanDefinition("red");

        // 根据实际的情况,判断接口,返回boolean值,就可以了
        return true;
    }

}

使用,直接上代码

@Conditional({ MyCondition.class })
@Configuration
public class MyConfig {

    @Bean
    @Conditional({ MyCondition.class })
    public Date date() {
        return new Date();
    }
}

可以标注在类上,也可以标注在实际的方法上,如果标注在类型,只有类上的,判断true,才会继续实例化标注了@Bean的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值