【源码】Spring —— BeanFactory 解读 1 bean工厂分支接口

tech2024-11-09  6

【源码】Spring —— BeanFactory 解读 1 bean工厂分支接口

前言版本BeanFactoryHierarchicalBeanFactoryConfigurableBeanFactory ListableBeanFactoryAutowireCapableBeanFactoryConfigurableListableBeanFactory 类图总结

前言

本系列章节解读 BeanFactory 接口,这是 Spring 最核心的接口之一,其下有两大分支

bean工厂:管理 Spring容器 中所有的 bean,实现 Spring 的核心功能 —— 依赖注入(Dependency Injection)Application:基于 bean工厂 管理 bean,注册并管理 BeanDefinition,加载并刷新容器配置,笼统意义上的 Spring容器

本章节从 bean工厂 开始解读,先介绍所有相关的接口

版本

Spring 5.2.x

BeanFactory

public interface BeanFactory { // 用于标识是否获取 FactoryBean 本身 String FACTORY_BEAN_PREFIX = "&"; // 根据 beanName 获取 bean实例 Object getBean(String name) throws BeansException; // 可以指定父类或者接口 <T> T getBean(String name, Class<T> requiredType) throws BeansException; // 提供创建实例的参数,创建这个 bean实例 时会用到 Object getBean(String name, Object... args) throws BeansException; // 指定类型 <T> T getBean(Class<T> requiredType) throws BeansException; // 指定类型和参数 <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; // 获取对应的 ObjectProvider <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); // 指定 beanName 的 bean实例 是否存在 // 注意,存在并不意味这可以 getBean 获得 boolean containsBean(String name); // 是否单例 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 是否原型 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 类型是否匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 类型获取 @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; @Nullable Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException; // 别名获取 String[] getAliases(String name); }

提供了以上方法,其中包括各种 getBean 方法。其中 ResolvableType 类可以理解为 Spring 对 JDK Type 类的封装,之后的类也会经常用到

关于 Type 和 ResolvableType,可以阅读下面文章

关于 Type 和 ResolvableType

HierarchicalBeanFactory

public interface HierarchicalBeanFactory extends BeanFactory { // 获取 父BeanFactory @Nullable BeanFactory getParentBeanFactory(); // local,即指查看本容器中是否存在 boolean containsLocalBean(String name); }

拓展维护了 层级 关系,getParentBeanFactory 方法可获取父级 bean工厂

ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { // 单例 String SCOPE_SINGLETON = "singleton"; // 原型 String SCOPE_PROTOTYPE = "prototype"; // 设置 父BeanFactory,不能改变 void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; // 设置类加载器,默认当前线程上下文的 类加载器 void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); @Nullable ClassLoader getBeanClassLoader(); // 设置临时类加载器(用于 load-time weaving(静态织入)) void setTempClassLoader(@Nullable ClassLoader tempClassLoader); @Nullable ClassLoader getTempClassLoader(); // 是否缓存 bean元数据(比如 bean definition,bean class等) // 关闭以支持热刷新 void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata(); // 指定 bean definition 中表达式的解析类 BeanExpressionResolver void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); @Nullable BeanExpressionResolver getBeanExpressionResolver(); // ConversionService void setConversionService(@Nullable ConversionService conversionService); @Nullable ConversionService getConversionService(); // PropertyEditor 相关 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); void copyRegisteredEditorsTo(PropertyEditorRegistry registry); // TypeConverter void setTypeConverter(TypeConverter typeConverter); TypeConverter getTypeConverter(); // 设置 StringValueResolver 用于解析类似 注解属性值 void addEmbeddedValueResolver(StringValueResolver valueResolver); boolean hasEmbeddedValueResolver(); // 解析给定值 @Nullable String resolveEmbeddedValue(String value); // 添加一个新的 BeanPostProcessor void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); // 返回 BeanPostProcessor 数量 int getBeanPostProcessorCount(); // 注册一个 Scope void registerScope(String scopeName, Scope scope); // 返回所有显示注册的 Scope(换言之,singleton 和 prototype 不返回 String[] getRegisteredScopeNames(); // 返回指定 name 的 Scope,不包括 singleton 和 prototype @Nullable Scope getRegisteredScope(String scopeName); // 提供与此工厂相关的安全访问控制上下文 AccessControlContext getAccessControlContext(); // 拷贝目标 ConfigurableBeanFactory,但不包括 BeanDefinition 相关的 元数据 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); // 给指定 beanName 注册 别名 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; // 解析所有别名 void resolveAliases(StringValueResolver valueResolver); // 将给定 beanName 的 BeanDefinition 与其所有父 BeanDefinition 合并 BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 给定 beanName 是否 FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // Spring内部 用来控制 bean 的创建状态(即正在创建) void setCurrentlyInCreation(String beanName, boolean inCreation); // 指定beanName 对应的 单例实例 是否正在创建中 boolean isCurrentlyInCreation(String beanName); // 给指定 beanName 的 bean 设置 依赖bean // 依赖bean 的销毁先于 指定bean void registerDependentBean(String beanName, String dependentBeanName); // 返回所有 依赖于 给定 beanName bean 的名称 String[] getDependentBeans(String beanName); // 返回给定 beanName 依赖的所有 bean 的名称 String[] getDependenciesForBean(String beanName); // 根据给定 beanName 的 bean definition 销毁 指定bean void destroyBean(String beanName, Object beanInstance); // 销毁当前作用域中指定 beanName 的实例 void destroyScopedBean(String beanName); // 在容器销毁时调用,销毁所有 单例bean void destroySingletons(); }

在 HierarchicalBeanFactory 的基础上拓展了各种配置能力,比如 ClassLoader ConversionService 等

关于 ConversionService 的介绍,可以阅读下面文章

Spring —— Convert 解读

ListableBeanFactory

public interface ListableBeanFactory extends BeanFactory { // 是否包含指定 beanName 的 BeanDefinition boolean containsBeanDefinition(String beanName); // 所有 BeanDefinition 数量,只考虑当前层级 // 也并不会包括我们自己注册的 单例bean int getBeanDefinitionCount(); // 所有 BeanDefinition name,只考虑当前层级 // 也并不会包括我们自己注册的 单例bean String[] getBeanDefinitionNames(); // 匹配给定类型(包括子类)的所有 beanName(FactoryBean 生成的也算) String[] getBeanNamesForType(ResolvableType type); String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit); String[] getBeanNamesForType(@Nullable Class<?> type); String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); // 返回指定类型的 bean map (beanName -> bean实例) <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException; <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; // 获取标注了指定注解的所有 beanName String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); // 获取标注了指定注解的所有 map (beanName -> bean实例) Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; // 返回指定 beanName 的 bean实例 上的指定类型的 注解 // 也包括父类、接口、FactoryBean @Nullable <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException; }

BeanFactory 的拓展,提供了 枚举 所有 bean实例 的功能。

注意,如果同时拓展了 HierarchicalBeanFactory ,并不会枚举其他 层级的 bean实例

AutowireCapableBeanFactory

public interface AutowireCapableBeanFactory extends BeanFactory { // 默认 int AUTOWIRE_NO = 0; // by name int AUTOWIRE_BY_NAME = 1; // by type int AUTOWIRE_BY_TYPE = 2; // 构造方法注入 int AUTOWIRE_CONSTRUCTOR = 3; // (Spring 3.0 后标记过时) @Deprecated int AUTOWIRE_AUTODETECT = 4; // 获取 原始bean(代理前) 的后缀 String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL"; // 创建 bean实例,执行所有 BeanPostProcessors 后处理 <T> T createBean(Class<T> beanClass) throws BeansException; // 填充给定 bean实例 的属性 void autowireBean(Object existingBean) throws BeansException; // 配置一个初始化的 bean实例对象(注入属性、工厂回调、后处理) Object configureBean(Object existingBean, String beanName) throws BeansException; // 根据指定注入方式创建 bean实例,执行所有 BeanPostProcessors 后处理 Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 属性填充 Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; // 初始化给定 bean,执行 Aware 回调、后处理回调 等 Object initializeBean(Object existingBean, String beanName) throws BeansException; // 执行给定 bean实例 的所有 postProcessBeforeInitialization 后处理 Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; // 执行给定 bean实例 的所有 postProcessAfterInitialization 后处理 Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; // 销毁给定bean void destroyBean(Object existingBean); // 获取指定类型的 bean 封装成 NamedBeanHolder 返回 <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; // 解析并返回对应的 bean Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException; @Nullable Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; @Nullable Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException; }

拓展了 BeanFactory,提供了对bean实例 生命周期 的细粒度控制,比如 属性注入、初始化实例、后处理方法 等

ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { // 忽略给定 Class 类型的自动装配 void ignoreDependencyType(Class<?> type); // 忽略给定 接口 类型的自动装配 void ignoreDependencyInterface(Class<?> ifc); void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue); // 指定bean 是否可以作为 自动装配 的候选对象 boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException; // 获取给定 name 对应的 BeanDefinition BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // beanName 的迭代器 Iterator<String> getBeanNamesIterator(); // 清空合并 BeanDefinition 的 元数据 缓存 void clearMetadataCache(); // 冻结 bean definitions,即无法被 后处理 修改 void freezeConfiguration(); boolean isConfigurationFrozen(); // 在容器启动的结束阶段执行 // 确保所有 非懒加载 的 单例实例(包括 FactoryBeans)成功创建 void preInstantiateSingletons() throws BeansException; }

拓展了 ListableBeanFactory AutowireCapableBeanFactory 和 ConfigurableBeanFactory,是功能最强大的接口

类图

总结

本章节介绍了 BeanFactory 体系下 bean工厂 分支的几个主要接口

BeanFactory :顶层接口HierarchicalBeanFactory :拓展了 层级 的维护ListableBeanFactory :拓展了 枚举 所有 bean实例 的功能AutowireCapableBeanFactory :提供 自动装配 的能力ConfigurableBeanFactory:提供了 配置 的能力ConfigurableListableBeanFactory:在上述所有接口基础上拓展了若干方法

下一章节,我们介绍抽象实现类 AbstractBeanFactory

下一章节:【源码】Spring —— BeanFactory 解读 2 AbstractBeanFactory

最新回复(0)