当前位置: 首页 > 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。

    相关文章:

    Spring源码-BeanFactory类关系层级

    BeanFactory 访问Spring bean容器的根接口。 这是bean容器的基本客户端视图;例如{link ListableBeanFactory}和{link org.springframework.beans.factory.config。ConfigurableBeanFactory}可用于特定目的。 这个接口是由包含许多bean定义的对象实现的,每个bean定义…...

    Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开

    背景 在调研浏览器多开的过程中,electron 有自带的 browserview,webview,但是上面两个受制于 electron 内核版本限制,升级不够灵活,对新版的网页支持可能不及时,甚至不兼容,必须通过发布新的客…...

    手持式气象检测设备:便携科技,气象探测

    一、手持式气象检测设备:小巧身躯,大能量 手持式气象检测设备,顾名思义,是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器,能够实时获取气象数据,并通过显示屏或手机APP…...

    shell 发送邮件脚本(免密)

    #!/bin/bash ENV$1 TARGET_VERSION$2 TO$3 # SMTP服务器设置 SMTP_SERVER"邮箱服务地址" SMTP_PORT"25"# 邮件信息 FROM"jenkinsy.com" SUBJECT"Deployment Status Notification" BODY$ENV"发布完成,版本 &#xff1a…...

    Web动画(lottie篇)

    一、Lottie简介 Lottie是一个库,可以解析使用AE制作的动画(需要用bodymovin导出为json格式),支持web、ios、android和react native。在web侧,lottie-web库可以解析导出的动画json文件,并将其以svg或者canva…...

    昇思25天学习打卡营第20天|CV-ResNet50图像分类

    打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点:通过网络层数加深,感知…...

    grep: /etc/mysql/my.cnf: 没有那个文件或目录

    当你收到 "grep: /etc/mysql/my.cnf: 没有那个文件或目录" 的错误信息时,这意味着你的系统上可能没有默认的 MySQL/MariaDB 配置文件 /etc/mysql/my.cnf。MariaDB 和 MySQL 可能会使用不同的配置文件路径。下面是一些步骤来帮助你找到正确的配置文件&…...

    养猫好物|宠物空气净化器是不是智商税?靠谱猫毛空气净化器推荐

    宠物空气净化器是不是智商税?宠物空气净化器是否真有其效,是许多由于要不要买空气净化器养宠人心中的疑惑。作为呼吸科医生,我深知良好空气质量对呼吸道健康的重要性,因此建议所有家庭,尤其是养有猫狗等宠物的家庭&…...

    【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)

    为探讨数据科学和计算智能领域的关键问题,促进相关交流,2024年智能计算与数据分析国际学术会议(ICDA 2024)将于2024年9月6日-8日在中国青岛召开。 本届会议拟邀请数据分析和计算智能领域的顶级专家、学者和产业界优秀人才,围绕当前…...

    AutoGen框架革新:解锁新闻稿写作的新境界

    前言 今天带来的仍然是AutoGen基于AssistantAgent和UserProxyAgent的例子,以帮助大家一起消化目前最前卫的AI应用框架。这是一个AIGC最擅长,因为生成新闻稿嘛,同时又需要利用Agent的一个常规Demo。了解LangChain的同学,会通过对比…...

    数据结构之队列详解

    1.队列的概念以及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFo(Frist in Frist out)的特性 入队列:进行插入才操作的一端称为队尾 出队列:进行删除操作的一…...

    [渗透测试] 反序列化漏洞

    反序列化漏洞 ​ 序列化:将对象的状态信息转换为可以传输或存储的形式的过程。简单的来说,就是将一个抽象的对象转换成可以传输的字符串 ,以特定的形式在进行之间实现跨平台的传输。 序列化大多以字节流、字符串、json串的形式来传输。将对…...

    C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

    C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换(Implicit Conversions) 隐式转换是编译器自动进行的类型转换,通常在需要将一个类型转换为另一个类型以匹配函数参…...

    等保通过标准

    等保测评,即信息系统安全等级保护测评,是国家对信息系统安全等级保护的一种评估活动。它涉及到安全管理、安全技术、安全运维等多个方面,旨在评定信息系统是否达到了国家设定的安全等级保护标准。等保测评的通过标准通常会根据信息系统的安全…...

    reduceByKey 函数详解

    reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数: keySelector:这是一个映射函数,用于从输入元素中提取键。 valueReducer:这是另一个函数,用于将具有相同键的…...

    CSI-RS在信道中传输的过程

    简单介绍CSI-RS信号生成,在信道中传输和接收的过程 1.载波配置 首先需要配置载波相关的参数 系统带宽和子载波间隔 5G NR中,系统带宽和子载波间隔是两个关键参数,共同决定无线资源的分配和使用 系统带宽 5G NR支持广泛的系统带宽&…...

    建造者模式(Builder Pattern)工作原理

    文章目录 [toc]建造者模式(Builder Pattern)工作原理一、基本概念二、主要角色三、工作流程(一)定义产品(二)定义抽象建造者(三)定义具体建造者(四)定义指挥者…...

    Ubuntu22.04安装Go语言的几种方式

    在 Ubuntu 22.04 上安装 Go 语言可以通过几种不同的方法,以下是两种常见的安装方法: 方法1:使用 go 官方安装脚本 打开终端。 下载 Go 语言的安装脚本: curl -O https://go.dev/dl/go1.22.5.linux-amd64.tar.gz请检查 Go 官方网…...

    Typora笔记上传到CSDN

    1.Typora 安装 Typora链接:百度网盘 提取码:b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…...

    Modbus转BACnet/IP网关BA100-配硬件说明

    在现代自动化系统中,不同设备和系统之间的通信至关重要,Modbus和BACnet/IP协议虽然各有优势,但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁,允许不同系统之间的无缝数据交换。 一、Modbus转…...

    DjangoRF实战-2-apps-users

    1、用户模块 创建一个用户模块子应用,用来管理用户,和认证和授权。 1.1根目录创建apps, 为了使用方便,还需要再pycharm中设置一下资源路径,就可以自动提示 1.2注册子应用 1.3添加应用根目录到环境变量path python导…...

    java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

    有面试题,有synchronized锁,threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作,手动释放锁,显式地获取锁(属…...

    Apache Spark:深度解析

    文章目录 引言Apache Spark 官网链接Spark 的原理1. 核心组件2. 弹性分布式数据集(RDD)3. 执行模型 基础使用1. 环境搭建2. 示例代码 高级功能1. DataFrame 和 Dataset2. 机器学习3. 流处理 优缺点优点缺点 结论 引言 Apache Spark 是一个快速、通用、可…...

    使用umi作为模板如何实现权限管理

    三种权限管理的方法: 在做后台管理系统时,难免会使用到权限管理,权限管理方式有三种,分别是:路由、守卫、后端配合。 路由:通过动态路由,根据登录人员不同注册不同的路由,直接让没…...

    系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读

    系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识 4.1.1 信息安全的概念4.1.1.1 信息安全的范围4.1.1.1.1 设备安全4.1.1.1.2 数据安全4.1.1.1.3 内容安全4.1.1.1.4 行为安全 4.1.2 信息存储安全4.1.2.1 信息使用的安全4.1.2.1.1 用户的标识与验证4.1.2.1.…...

    【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架

    探索Rust游戏开发引擎:选择合适的工具 前言 随着Rust语言的不断发展,越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架,分别对其核心功能、使用场景、安装与配置以及API进行概览…...

    从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

    近年来,星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作,推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术,以及信雅达在金融领域的深厚积累,围绕数…...

    自定义维度映射:Kylin Cube设计的高级玩法

    自定义维度映射:Kylin Cube设计的高级玩法 在数据仓库领域,Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体(Cube)来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...

    c17 新特性 字面量,变量,函数,隐藏转换等

    导论 c17新特性引入了许多新的语法,这些语法特性更加清晰,不像传统语法,语义飘忽不定,比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i,最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...

    git操作的一些备忘录

    1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一:(已经提交到git线上仓库了,git reset操作,会把之前提交的都删除,感觉有点危险) 想要让Git回退历史,有以下步骤: 使用git log命令&#xff0c…...