概述
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");
}
}