当前位置: 首页 > news >正文

Spring源码-BeanFactory类关系层级

在这里插入图片描述
在这里插入图片描述

BeanFactory

访问Spring bean容器的根接口。
这是bean容器的基本客户端视图;例如{@link ListableBeanFactory}和{@link org.springframework.beans.factory.config。ConfigurableBeanFactory}可用于特定目的。
这个接口是由包含许多bean定义的对象实现的,每个bean定义由一个String名称唯一标识。根据bean定义,工厂将返回所包含对象的独立实例(Prototype设计模式)或单个共享实例(Singleton设计模式的高级替代方案,其中实例是工厂范围内的单例)。返回哪种类型的实例取决于bean工厂配置:API是相同的。从Spring 2.0开始,根据具体的应用程序上下文(例如:web环境中的“请求”和“会话”作用域)。
这种方法的要点在于BeanFactory是应用程序组件的中心注册中心,并集中应用程序组件的配置(例如,单个对象不再需要读取属性文件)。请参阅“专家一对一J2EE设计与开发”的第4章和第11章,了解这种方法的好处。

请注意,通常最好依赖依赖注入(“推送”配置)通过setter或构造函数来配置应用程序对象,而不是使用任何形式的“拉”配置,如BeanFactory查找。Spring的依赖注入功能是使用这个BeanFactory接口及其子接口实现的。
请注意,通常最好依赖依赖注入(“推送”配置)通过setter或构造函数来配置应用程序对象,而不是使用任何形式的“拉”配置,如BeanFactory查找。Spring的依赖注入功能是使用这个BeanFactory接口及其子接口实现的。
通常,BeanFactory将加载存储在配置源(如XML文档)中的bean定义,并使用{@code org.springframework。Beans}包来配置bean。但是,实现可以根据需要直接在Java代码中返回它创建的Java对象。对于如何存储定义没有任何限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持bean之间的引用(依赖注入)。

与{@link ListableBeanFactory}中的方法相反,如果这是{@link HierarchicalBeanFactory},该接口中的所有操作也将检查父工厂。如果在这个工厂实例中没有找到bean,将询问直接的父工厂。这个工厂实例中的bean应该覆盖任何父工厂中同名的bean。

Bean工厂实现应该尽可能地支持标准的Bean生命周期接口。初始化方法的完整集合及其标准顺序为:

  1. BeanNameAware的{@code setBeanName}
  2. BeanClassLoaderAware的{@code setBeanClassLoader}
  3. BeanFactoryAware的{@code setBeanFactory}
  4. EnvironmentAware的{@code setEnvironment}
  5. EmbeddedValueResolverAware的{@code setEmbeddedValueResolver}
  6. ResourceLoaderAware的{@code setResourceLoader}(仅适用于在应用程序上下文中运行时)
  7. ApplicationEventPublisherAware的{@code setApplicationEventPublisher}(仅适用于在应用程序上下文中运行时)
  8. MessageSourceAware的{@code setMessageSource}(仅适用于在应用程序上下文中运行时)
  9. ApplicationContextAware的{@code setApplicationContext}(仅适用于在应用程序上下文中运行时)
  10. ServletContextAware的{@code setServletContext}(仅适用于在web应用程序上下文中运行时)
  11. BeanPostProcessors的
  12. InitializingBean的{@code afterPropertiesSet}
  13. 自定义初始化方法定义
    1. 在关闭bean工厂时,应用以下生命周期方法:

      1. DestructionAwareBeanPostProcessors
      2. {@code postProcessBeforeDestruction}方法
      3. DisposableBean的{@code destroy}
      4. 一个自定义的销毁方法定义

    ListableBeanFactory

    {@link BeanFactory}接口的扩展,由可以枚举所有bean实例的bean工厂实现,而不是像客户端请求的那样逐个按名称进行bean查找。预加载所有bean定义(如基于xml的工厂)的BeanFactory实现可以实现这个接口。

    如果这是一个{@link HierarchicalBeanFactory},返回值将不考虑任何BeanFactory层次结构,而只与当前工厂中定义的bean相关。使用{@link BeanFactoryUtils} helper类也可以考虑祖先工厂中的bean。

    这个接口中的方法将只尊重这个工厂的bean定义。它们将忽略任何通过其他方式(如{@link org.springframework.beans.factory.config)注册的单例bean。除了{@code getBeanNamesForType}和{@code getBeansOfType}之外,ConfigurableBeanFactory}的{@code registerSingleton}方法也会检查这种手动注册的单例。当然,BeanFactory的{@code getBean}也允许对这种特殊bean进行透明访问。然而,在典型的场景中,所有bean都将由外部bean定义定义,因此大多数应用程序不需要担心这种差异。

    注意:除了{@code getBeanDefinitionCount}和{@code containsBeanDefinition}之外,该接口中的方法不是为频繁调用而设计的。实现可能很慢。

    HierarchicalBeanFactory

    由bean工厂实现的子接口,可以是层次结构的一部分。

    对应的{@code setParentBeanFactory}方法可以在ConfigurableBeanFactory接口中找到,该方法允许以可配置的方式设置父节点。

    AutowireCapableBeanFactory

    {@link org.springframework.beans.factory的扩展。接口BeanFactory}将由能够自动装配的bean工厂实现,前提是它们希望为现有bean实例公开此功能。

    BeanFactory的这个子接口不打算在普通的应用程序代码中使用:坚持使用{@link org.springframework.beans.factory。或者{@link org.springframework.beans.factory。ListableBeanFactory}用于典型用例。其他框架的集成代码可以利用这个接口来连接和填充Spring不控制其生命周期的现有bean实例。例如,这对于WebWork Actions和Tapestry Page对象特别有用。

    注意这个接口不是由{link org.springframework.context实现的。ApplicationContext} facade,因为它很少被应用程序代码使用。也就是说,它也可以从应用程序上下文获得,可以通过ApplicationContext的{link org.springframework.context.ApplicationContextgetAutowireCapableBeanFactory()}方法访问。

    你也可以实现{@link org.springframework.beans.factory。接口,即使在ApplicationContext中运行,也会公开内部的BeanFactory,以访问AutowireCapableBeanFactory:只需将传入的BeanFactory转换为AutowireCapableBeanFactory。

    http://www.lryc.cn/news/406947.html

    相关文章:

  14. Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开
  15. 手持式气象检测设备:便携科技,气象探测
  16. shell 发送邮件脚本(免密)
  17. Web动画(lottie篇)
  18. 昇思25天学习打卡营第20天|CV-ResNet50图像分类
  19. grep: /etc/mysql/my.cnf: 没有那个文件或目录
  20. 养猫好物|宠物空气净化器是不是智商税?靠谱猫毛空气净化器推荐
  21. 【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)
  22. AutoGen框架革新:解锁新闻稿写作的新境界
  23. 数据结构之队列详解
  24. [渗透测试] 反序列化漏洞
  25. C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等
  26. 等保通过标准
  27. reduceByKey 函数详解
  28. CSI-RS在信道中传输的过程
  29. 建造者模式(Builder Pattern)工作原理
  30. Ubuntu22.04安装Go语言的几种方式
  31. Typora笔记上传到CSDN
  32. Modbus转BACnet/IP网关BA100-配硬件说明
  33. DjangoRF实战-2-apps-users
  34. java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象
  35. Apache Spark:深度解析
  36. 使用umi作为模板如何实现权限管理
  37. 系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读
  38. 【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架
  39. 从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案
  40. 自定义维度映射:Kylin Cube设计的高级玩法
  41. c17 新特性 字面量,变量,函数,隐藏转换等
  42. git操作的一些备忘录
  43. vscode回退不显示了,不方便操作