1.Spring源码核心注解Conditional

概述

  Spring源码核心注解Conditional

注解Conditional

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

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

}

Condition 源码

@FunctionalInterface
public interface Condition {

	// 判断条件是否匹配
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}
  • context上下文,获取容器中的bean的信息
  • metadata:获取被 @Conditional 标注的对象上的所有注解信息

ConditionContext源码

public interface ConditionContext {

	// 返回 bean 定义注册器,用于获取 bean 定义的注册表,可以用来注册和获取 bean 定义的各种配置信息
	BeanDefinitionRegistry getRegistry();

	// 用于获取 Bean 工厂,可以用来获取或操作 Bean 实例,相当于一个 ioc 容器对象
	@Nullable
	ConfigurableListableBeanFactory getBeanFactory();

	// 用于获取环境变量和属性值等配置信息
	Environment getEnvironment();

	// 用于获取资源文件,比如xml文件、图片、文本等
	ResourceLoader getResourceLoader();

	// 用于获取类加载器,可以用来加载类或资源文件
	@Nullable
	ClassLoader getClassLoader();

}

BeanDefinitionRegistry

public interface BeanDefinitionRegistry extends AliasRegistry {

	// 用于向 Bean 定义注册表中注册一个 Bean定义,参数 beanName 表示Bean的名称、beanDefinition表示Bean的定义信息
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	// 从Bean定义注册表中移除指定名称的Bean定义,参数 beanName 表示要移除的 Bean 名称
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 获取指定名称的Bean定义,参数beanName表示要获取的Bean名称
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 判断指定名称的Bean定义是否存在于注册表中,参数beanName表示要判断的Bean名称
	boolean containsBeanDefinition(String beanName);

	// 获取所有Bean定义的名称,返回一个String数组
	String[] getBeanDefinitionNames();

	// 获取Bean定义的数量
	int getBeanDefinitionCount();

	// 判断指定名称的Bean是否已经被使用,参数beanName表示要判断的Bean名称,如果该名称已被使用,则返回true,否则返回false
	boolean isBeanNameInUse(String beanName);

}

BeanDefinition

  • 是Spring容器中最重要的概念之一,它是容器创建和管理Bean实例的基础,对Bean的定义信息的抽象和封装
  • 描述一个Bean的定义信息,包括Bean的名称 、类型、作用域、属性等信息
  • 可以对Bean的创建和管理进行详细的配置和控制,例如可以指定Bean的作用域、是否懒加载、是否自动注入等属性
  • 用途
    • 定义Bean的基本信息,包括Bean的名称 、类型、作用域
    • 定义Bean的属性信息,包括Bean的属性名称、类型、值等
    • 定义Bean的生命周期信息,包括Bean的初始化方法、销毁方法等
    • 定义Bean的依赖关系,包括Bean之间的依赖关系、注入方式等
    • 定义Bean的AOP信息,包括切面、通知、切点等

实践

@Configuration
public class DataSourceBeanManager {

//    @Bean("source-01")
    public String datasource1(){
        return "datasource-01";
    }

    @Bean("source-02")
    // 当Bean("source-01")不存在时,Bean("source-02")生效
    @Conditional(DataSourceCondition.class)
    public String datasource2(){
        return "datasource-02";
    }
}
public class DataSourceCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        BeanDefinitionRegistry registry = context.getRegistry();
        return !registry.containsBeanDefinition("source-01");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流月up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值