Spring5源码(13)-BeanFactory简介

简介: Spring5源码(13)-BeanFactory简介


前两篇已经简介了Spring及其IoC容器,本篇介绍IoC容器最基础的实现BeanFactory,其XmlBeanFactory实现类将作为分析的入口(

虽然该类已经被标记为过期,但是这不妨碍我们作为分析IoC的入口类

),接下来很多的篇幅将以XmlBeanFactory为入口,对IoC容器进行解析。

BeanFactory简介

IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工作。

接下来要介绍的类比较多,对于初看Spring源码的同学,只要知道BeanFactory的作用即可。

类图关系

  • IDEA查看类图-->光标定位到类或接口-->右键

  • XmlBeanFactory类图结构

蓝色的实线表示类与类之间的继承关系


绿色的实线表示接口与接口之间的继承关系


绿色的虚线表示类与接口之间的继承关系

XmlBeanFactory的继承体系比较复杂,但是在分析源码之间,了解一下类的继承关系将助于我们对源码的分析

从图中可以看到,顶级接口分别是BeanFactory,SingletonBeanRegistry,AliasRegistry

1.BeanFactory

//SpringIoC容器顶级接口
public interface BeanFactory {
    // 区分是获取FactoryBean还是FactoryBean的createBean创建的实例.如果&开始则获取FactoryBean;否则获取createBean创建的实例.
    String FACTORY_BEAN_PREFIX = "&";
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    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;
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
    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;
    String[] getAliases(String name);
}
1.1 ListableBeanFactory-->BeanFactory

//扩展了BeanFactory接口,提供了对bean的枚举能力,
//即可以返回bean的实例集合,而不用像BeanFactory只能返回单个bean的实例
//注意:如果存在父容器的话该接口不会考虑父容器中的bean,只会返回当前容器中的bean
public interface ListableBeanFactory extends BeanFactory {
    boolean containsBeanDefinition(String beanName);
    int getBeanDefinitionCount();
    String[] getBeanDefinitionNames();
    String[] getBeanNamesForType(ResolvableType type);
    String[] getBeanNamesForType(@Nullable Class<?> type);
    String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
    <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;
    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
    @Nullable
    <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException;
}
1.2 HierarchicalBeanFactory--> BeanFactory

//扩展了BeanFactory接口,提供了对父容器的访问功能
public interface HierarchicalBeanFactory extends BeanFactory {
    @Nullable
    BeanFactory getParentBeanFactory();
    boolean containsLocalBean(String name);
}
1.3 AutowireCapableBeanFactory --> BeanFactory

//扩展了BeanFactory,主要提供了自动装配能力
public interface AutowireCapableBeanFactory extends BeanFactory {
    //无自动装配
    int AUTOWIRE_NO = 0;
    //by-name装配
    int AUTOWIRE_BY_NAME = 1;
    //by-type装配
    int AUTOWIRE_BY_TYPE = 2;
    //constructor构造函数装配
    int AUTOWIRE_CONSTRUCTOR = 3;
    //自动装配,已被标记为过时
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;
    //-------------------------------------------------------------------------
    // 创建和填充外部bean实例的典型方法
    //-------------------------------------------------------------------------
    <T> T createBean(Class<T> beanClass) throws BeansException;
    void autowireBean(Object existingBean) throws BeansException;
    Object configureBean(Object existingBean, String beanName) throws BeansException;
    //-------------------------------------------------------------------------
    // 用于细粒度控制bean生命周期的方法
    //-------------------------------------------------------------------------
    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;
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
    void destroyBean(Object existingBean);
    //-------------------------------------------------------------------------
    // 委托方法解决注入点
    //-------------------------------------------------------------------------
    <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) 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;
}

ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory是BeanFactory的直接子接口,分别提供了对bean的枚举能力,对父容器的访问能力,对bean的自动装配能力

1.4 ConfigurableBeanFactory--> HierarchicalBeanFactory-->BeanFactory

//扩展了HierarchicalBeanFactory,SingletonBeanRegistry,主要提供了对BeanFactory的配置能力
//该接口扩展的内容较多,比如类加载器,类型转化,属性编辑器,BeanPostProcessor,
//作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁等
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
    标准单例范围的范围标识符:“singleton”。
    String SCOPE_SINGLETON = "singleton";
    //标准原型范围的范围标识符:“prototype”。
    String SCOPE_PROTOTYPE = "prototype";
    //设置父工厂,注意:不能更改父级工厂
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
    //设置类加载器以用于加载bean类。默认是线程上下文类加载器。
    void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
    //返回该工厂的类加载器
    @Nullable
    ClassLoader getBeanClassLoader();
    //指定用于类型匹配目的的临时ClassLoader。
    void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
    //获取用于类型匹配目的的临时ClassLoader。
    @Nullable
    ClassLoader getTempClassLoader();
    //设置是否缓存bean元数据,例如给定的bean定义(以合并方式)和已解析的bean类。默认打开。
    //关闭此标志以启用bean定义对象的热刷新,特别是bean类。如果此标志关闭,则任何bean实例的创建都将为新解析的类重新查询bean类加载器。
    void setCacheBeanMetadata(boolean cacheBeanMetadata);
    //返回是否缓存bean元数据
    boolean isCacheBeanMetadata();
    //为bean定义值中的表达式指定解析策略。
    //默认情况下,BeanFactory中没有活动表达式支持。ApplicationContext通常会在此处设置标准表达式策略,支持Unified EL兼容样式中的“#{...}”表达式。
    void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
    //返回bean定义值中表达式的解析策略。
    @Nullable
    BeanExpressionResolver getBeanExpressionResolver();
    //指定用于转换属性值的Spring 3.0 ConversionService,作为JavaBeans PropertyEditors的替代方法。
    void setConversionService(@Nullable ConversionService conversionService);
    //返回关联的ConversionService(如果有)。
    @Nullable
    ConversionService getConversionService();
    //添加PropertyEditorRegistrar以应用于所有bean创建过程。
    void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
    //为给定类型的所有属性注册给定的自定义属性编辑器。在工厂配置期间调用。
    void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
    //使用已在此BeanFactory中注册的自定义编辑器初始化给定的PropertyEditorRegistry。
    void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
    //设置此BeanFactory应用于转换bean属性值,构造函数参数值等的自定义类型转换器。
    //这将覆盖默认的PropertyEditor机制,因此使任何自定义编辑器或自定义编辑器注册表都无关紧要。
    void setTypeConverter(TypeConverter typeConverter);
    //获取此BeanFactory使用的类型转换器。这可能是每次调用的新实例,因为TypeConverters通常不是线程安全的。
    //如果默认的PropertyEditor机制处于活动状态,则返回的TypeConverter将知道已注册的所有自定义编辑器。
    TypeConverter getTypeConverter();
    //为嵌入值(例如注释属性)添加String解析器。
    void addEmbeddedValueResolver(StringValueResolver valueResolver);
    //确定是否已通过此Bean工厂注册了嵌入值解析程序resolveEmbeddedValue(String)。
    boolean hasEmbeddedValueResolver();
    //解析给定的嵌入值,例如注释属性。
    @Nullable
    String resolveEmbeddedValue(String value);
    //添加一个新的BeanPostProcessor,它将应用于此工厂创建的bean。在工厂配置期间调用。
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    //返回已注册的BeanPostProcessors的当前数量(如果有)。
    int getBeanPostProcessorCount();
    //注册给定范围,由给定的Scope实现支持。
    void registerScope(String scopeName, Scope scope);
    //返回所有当前注册的范围的名称。
    String[] getRegisteredScopeNames();
    //返回给定范围名称的Scope实现(如果有)。
    @Nullable
    Scope getRegisteredScope(String scopeName);
    //提供与此工厂相关的安全访问控制上下文。
    AccessControlContext getAccessControlContext();
    //复制给定其他工厂的所有相关配置。
    //应包括所有标准配置设置以及BeanPostProcessors,Scopes和工厂特定的内部设置。不应包含实际bean定义的任何元数据,例如BeanDefinition对象和bean名称别名。
    void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
    //给定bean名称,创建别名。
    void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
    //解析在此工厂中注册的所有别名目标名称和别名,将给定的StringValueResolver应用于它们。
    //例如,值解析器可以解析目标bean名称中的占位符,甚至可以解析别名中的占位符。
    void resolveAliases(StringValueResolver valueResolver);
    //返回给定bean名称的合并BeanDefinition,如果需要,将子bean定义与其父bean合并。也考虑祖先工厂中的bean定义。
    BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    //确定具有给定名称的bean是否为FactoryBean。
    boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
    //显式控制指定bean的当前创建状态。仅限容器内部使用。
    void setCurrentlyInCreation(String beanName, boolean inCreation);
    //确定指定的bean当前是否正在创建。
    boolean isCurrentlyInCreation(String beanName);
    //为给定的bean注册一个依赖bean,在销毁给定bean之前销毁它。
    void registerDependentBean(String beanName, String dependentBeanName);
    //返回依赖于指定bean的所有bean的名称(如果有)。
    String[] getDependentBeans(String beanName);
    //返回指定bean所依赖的所有bean的名称(如果有)。
    String[] getDependenciesForBean(String beanName);
    //根据bean的定义,销毁给定的bean实例(通常是从这个工厂获得的原型实例)。
    void destroyBean(String beanName, Object beanInstance);
    //销毁当前目标作用域中指定的作用域bean(如果有)。
    void destroyScopedBean(String beanName);
    销毁此工厂中的所有单例bean,包括已注册为一次性的内部bean。
    void destroySingletons();
}
1.5 ConfigurableListableBeanFactory

ConfigurableListableBeanFactory--> ListableBeanFactory-->BeanFactory

ConfigurableListableBeanFactory--> AutowireCapableBeanFactory-->BeanFactory

ConfigurableListableBeanFactory--> ConfigurableBeanFactory-->HierarchicalBeanFactory-->BeanFactory

ConfigurableListableBeanFactory继承了三个接口,并扩展了忽略依赖,自动装配判断,冻结bean的定义,枚举所有bean名称的功能

public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
    //忽略给定的自动装配依赖关系接口。
    void ignoreDependencyType(Class<?> type);
    //忽略给定的自动装配依赖关系接口。
    void ignoreDependencyInterface(Class<?> ifc);
    //使用相应的自动装配值注册特殊依赖关系类型。
    void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
    //确定指定的bean是否有资格作为autowire候选者,注入到声明匹配类型依赖关系的其他bean中。
    boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
    //返回指定bean的已注册BeanDefinition,允许访问其属性值和构造函数参数值(可以在bean工厂后处理期间修改)。
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    //返回所有bean名称的迭代对象
    Iterator<String> getBeanNamesIterator();
    //清除合并的bean定义缓存,删除尚未被认为有资格进行完整元数据缓存的bean条目。
    void clearMetadataCache();
    //冻结所有bean定义,表明注册的bean定义不会被修改或进一步后处理。
    void freezeConfiguration();
    //返回是否冻结此工厂的bean定义
    boolean isConfigurationFrozen();
    //确保所有非lazy-init单例都被实例化
    void preInstantiateSingletons() throws BeansException;
}
1.6 BeanFactory总结

分析了从BeanFactory到ConfigurableListableBeanFactory接口的概要功能

  • BeanFactory-->SpringIoC容器顶级接口,定义了对单个bean的获取,对bean的作用域判断,获取bean类型,获取bean别名的功能
  • ListableBeanFactory-->扩展了BeanFactory接口,并提供了对bean的枚举能力
  • HierarchicalBeanFactory-->扩展了BeanFactory接口,并提供了访问父容器的能力
  • AutowireCapableBeanFactory-->扩展了BeanFactory接口,并提供了自动装配能力
  • ConfigurableBeanFactory-->扩展了HierarchicalBeanFactory,并提供了对容器的配置能力
  • ConfigurableListableBeanFactory-->扩展了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory接口,并提供了忽略依赖,自动装配判断,冻结bean的定义,枚举所有bean名称的功能

以上介绍BeanFactory接口的分支,下面介绍AliasRegistry接口的分支,该分支下大部分都是实现类,代码较多,也较为复杂,其中细节,留在以后分析,下面只说下类的主要作用

2. AliasRegistry接口及其实现类简介
  • AliasRegistry-->定义bean的别名管理
  • SimpleAliasRegistry-->实现别名管理接口
  • SingletonBeanRegistry-->提供单例注册,查询服务
  • DefaultSingletonBeanRegistry-->实现单例与DisposableBean的生命周期管理(创建,维护,销毁)
  • FactoryBeanRegistrySupport-->添加工厂方式创建类FactoryBean的支持

本篇主要从概念和功能上让大家对BeanFactory有所了解,接下来几篇介绍IoC容器的初始化及bean的获取





目录
相关文章
|
2月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
7月前
|
前端开发 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档—— Swagger 简介
第6课介绍了在Spring Boot中集成Swagger2以展示在线接口文档的方法。随着前后端分离架构的发展,API文档成为连接前端与后端开发的重要纽带。然而,代码更新频繁导致文档难以同步维护,Swagger2解决了这一问题。通过Swagger,在线API文档不仅方便了接口调用方查看和测试,还支持开发者实时测试接口数据。本文使用Swagger 2.2.2版本,讲解如何在Spring Boot项目中导入并配置Swagger2工具,从而高效管理接口文档。
231 0
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
398 70
|
4月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
158 15
|
7月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
126 0
|
9月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
317 7
|
10月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
208 2
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
242 1
|
12月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
424 5