目录
- 概述
- 注解Conditional
- Condition 源码
- ConditionContext源码
- BeanDefinitionRegistry
- BeanDefinition
- 实践
概述
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 容器对象@NullableConfigurableListableBeanFactory getBeanFactory();// 用于获取环境变量和属性值等配置信息Environment getEnvironment();// 用于获取资源文件,比如xml文件、图片、文本等ResourceLoader getResourceLoader();// 用于获取类加载器,可以用来加载类或资源文件@NullableClassLoader 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,否则返回falseboolean 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 {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {BeanDefinitionRegistry registry = context.getRegistry();return !registry.containsBeanDefinition("source-01");}
}