欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 1.Spring源码核心注解Conditional

1.Spring源码核心注解Conditional

2024/10/24 15:16:16 来源:https://blog.csdn.net/2301_79691134/article/details/140296628  浏览:    关键词:1.Spring源码核心注解Conditional

目录

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com