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的方法

原创文章 83 获赞 155 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_28410283/article/details/91356551