BeanFactory和FactoryBean,ApplicationContext的关系

news2025/1/12 8:54:38
  • 他们的区别比较容易理解,从字面意思就能区分开来,BeanFactory是Bean工厂,而FactoryBean是工厂Bean
  • BeanFactory,Spring中工厂的顶层规范,他是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
  • 它定义了getBean()、containsBean()等管理Bean的通用方法
  • 这是基本的 Spring 模块,提供 Spring 框架的基础功能,BeanFactory 是 任何以Spring 为基础的应用的核心
  • Spring 框架建立在此模块之上,它使 Spring 成为一个容器
  • Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离
  • 最常用的 BeanFactory 实现是 XmlBeanFactory 类
  • 它根据 XML 文件中的定义加载 beans;该容器从 XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用
  • BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器
  • 其中ApplicationContext是BeanFactory的子接口
  • 依赖关系
  • BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系
  • ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
    • 继承MessageSource,因此支持国际化
    • 统一的资源文件访问方式
    • 提供在监听器中注册bean的事件
    • 同时加载多个配置文件
    • 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层
  • 加载方式
  • BeanFactory采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化
  • 这样,我们就不能发现一些存在的Spring的配置问题
  • 如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用调用getBean方法才会抛出异常
  • ApplicationContext,它是在容器启动时,一次性创建了所有的Bean
  • 这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入
  • ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean,确保当你需要的时候,你就不用等待,因为它们已经创建好了
  • 相对于基本的BeanFactory,ApplicationContext唯一的不足是占用内存空间
  • 当应用程序配置Bean较多时,程序启动较慢
  • 创建方式
  • BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader
  • 注册方式
  • BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
  • Spring设计了两个接口用以表示容器
    • BeanFactory
    • ApplicationContext
  • BeanFactory 粗暴简单,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例
  • 通常只提供注册(put),获取(get)这两个功能,可以称之为“低级容器”
  • ApplicationContext 可以称之为“高级容器”
  • 因为他比 BeanFactory 多了更多的功能
  • 他继承了多个接口,因此具备了更多的功能
  • 例如资源的获取,支持多种消息(例如 JSP tag 的支持),对 BeanFactory 多了工具级别的支持等待
  • 所以你看他的名字,已经不是 BeanFactory 之类的工厂了,而是“应用上下文”,代表着整个大容器的所有功能
  • 该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的bean
  • 当然,除了这两个大接口,还有其他的辅助接口,但我今天不会花太多篇幅介绍他们
  • 为了更直观的展示 “低级容器” 和 “高级容器” 的关系,我这里通过常用的 ClassPathXmlApplicationContext类,来展示整个容器的层级 UML 关系

  • 最上面的 BeanFactory,下面的 3 个绿色的,都是功能扩展接口,这里就不展开讲
  • 看下面的隶属 ApplicationContext 粉红色的 “高级容器”,依赖着 “低级容器”,这里说的是依赖,不是继承
  • 他依赖着 “低级容器” 的 getBean 功能
  • 而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)
  • 通常用户看到的就是“高级容器”
  • 但 BeanFactory 也非常够用;左边灰色区域的是 “低级容器”,只负载加载 Bean,获取 Bean
  • 容器其他的高级功能是没有的
  • 例如上图画的 refresh 刷新 Bean 工厂所有配置,生命周期事件回调等
  • ApplicationContext通常的实现
    • FileSystemXmlApplicationContext:此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数
    • ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置
    • WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean
  • BeanFactory-框架基础设施
  • BeanFactory是Spring框架的基础设施,面向 Spring 本身;
  • ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory

  • 1-BeanDefinitionRegistry 注册表
    • Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition 对象表示,它描述了 Bean 的配置信息
    • 而 BeanDefinitionRegistry 接口提供了向容器手工注册 BeanDefinition 对象的方法
  • 2-BeanFactory 顶层接口
    • 位于类结构树的顶端,它最主要的方法就是 getBean(String beanName),该方法从容器中返回特定名称的 Bean
    • BeanFactory 的功能通过其他的接口得到不断扩展
  • 3-ListableBeanFactory
    • 该接口定义了访问容器中 Bean 基本信息的若干方法
    • 如查看 Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一 Bean 等方法
  • 4-HierarchicalBeanFactory 父子级联
    • 父子级联 IoC 容器的接口,子容器可以通过接口方法访问父容器
    • 通过 HierarchicalBeanFactory 接口,Spring 的 IoC 容器可以建立父子层级关联的容器体系
    • 子容器可以访问父容器中的 Bean,但父容器不能访问子容器的 Bean
    • Spring 使用父子容器实现了很多功能,比如在 Spring MVC 中,展现层 Bean 位于一个子容器中,而业务层和持久层的 Bean 位于父容器中
    • 这样,展现层 Bean 就可以引用业务层和持久层的 Bean,而业务层和持久层的 Bean 则看不到展现层的 Bean
  • 5-ConfigurableBeanFactory
    • 是一个重要的接口,增强了 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法
  • 6-AutowireCapableBeanFactory 自动装配
    • 定义了将容器中的 Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法
  • 7-SingletonBeanRegistry 运行期间注册单例 Bean
    • 定义了允许在运行期间向容器注册单实例 Bean 的方法
    • 对于单实例( singleton)的 Bean 来说,BeanFactory 会缓存 Bean 实例,所以第二次使用 getBean() 获取 Bean 时将直接从 IoC 容器的缓存中获取 Bean 实例
    • Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以beanName 为键保存在这个 HashMap 中
  • 8-依赖日志框
    • 在初始化 BeanFactory 时,必须为其提供一种日志框架,比如使用 Log4J,即在类路径下提供 Log4J 配置文件,这样启动 Spring 容器才不会报错
  • ApplicationContext 面向开发应用
  • ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能
  • ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基础上,还通过多个其他的接口扩展了 BeanFactory 的功能:

  • 1-ClassPathXmlApplicationContext:默认从类路径加载配置文件
  • 2-FileSystemXmlApplicationContext:默认从文件系统中装载配置文件
  • 3-ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等
  • 4-MessageSource:为应用提供 i18n 国际化消息访问的功能
  • 5-ResourcePatternResolver:所有 ApplicationContext 实现类都实现了类似于 PathMatchingResourcePatternResolver 的功能,可以通过带前缀的 Ant 风格的资源文件路径装载 Spring 的配置文件
  • 6-LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start() 和 stop() 两个方法,主要用于控制异步处理过程;在具体使用时,该接口同时被 ApplicationContext 实现及具体 Bean 实现,ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理和控制 JMX、任务调度等目的
  • 7-ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法:refresh() 和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力;在应用上下文关闭的情况下调用 refresh() 即可启动应用上下文,在已经启动的状态下,调用 refresh() 则清除缓存并重新装载配置信息,而调用 close() 则可关闭应用上下文
  • Spring容器中有两种Bean:普通Bean和工厂Bean
  • Spring直接使用前者,FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象

  • Spring通过反射机制利用的class属性指定的实现类来实例化bean
  • 在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在其中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到更好的效果
  • Spring为此提供了一个org.Springframework.beans.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑
  • Spring框架本身就自带了实现FactoryBean的70多个接口,如ProxyFactoryBean、MapFactoryBean、PropertiesFactoryBean等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1067681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http:…

最新AI创作程序源码ChatGPT系统网站源码/Ai绘画系统/支持OpenAI GPT全模型+国内AI全模型/详细搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

【audio】alsa pcm音频路径

文章目录 AML方案音频路径分析dump alsa pcm各个音频路径的原始音频流数据 AML方案音频路径分析 一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的,大家可以把它比作大坝,可以有好几个入水口和出水口&#xf…

回调函数兼函数指针与仿函数(谓词形式概论)

目录 前言 一、回调函数 1&#xff09;背景引入 2&#xff09;函数指针 3&#xff09;回调函数 4&#xff09;应用实例 &#xff08;1&#xff09;qsort() 库函数介绍 &#xff08;2&#xff09;void* 指针 &#xff08;3&#xff09;qsort() 调用实现 <> 函数指…

一种用于车联网安全数据共享的联邦双向连接宽度学习方案

A Federated Bidirectional Connection Broad Learning Scheme for Secure Data Sharing in Internet of Vehicles 由于IoV是一个多用户移动场景&#xff0c;数据共享的可靠性和效率需要进一步提高。联邦学习允许服务器在不从客户端获取私人数据的情况下交换参数&#xff0c;从…

细粒度特征提取和定位用于目标检测:PPCNN

1、简介 近年来&#xff0c;深度卷积神经网络在计算机视觉上取得了优异的性能。深度卷积神经网络以精确地分类目标信息而闻名&#xff0c;并采用了简单的卷积体系结构来降低图层的复杂性。基于深度卷积神经网络概念设计的VGG网络。VGGNet在对大规模图像进行分类方面取得了巨大…

1.1 基础热图绘制

1 写在前面 最近在作图&#xff0c;一直在寻找《小杜的生信笔记》前期发表的代码。众所周知&#xff0c;小杜的教程基本都是平时自己用到的绘图教程&#xff0c;也是自己一个分享和总结。 自己在后期作图的时候&#xff0c;也会去寻找自己前期的教程作为基础&#xff0c;进行…

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…

mysql面试题24:如何写sql,能够有效的使用到复合索引?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如何写sql,能够有效的使用到复合索引? 为了能够有效地使用到复合索引,需要考虑以下几点: 索引列顺序:复合索引的列顺序非常重要,应该将最频…

深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(二)

前言 在上一篇深入浅出&#xff0c;SpringBoot整合Quartz实现定时任务与Redis健康检测&#xff08;一&#xff09;_往事如烟隔多年的博客-CSDN博客 文章中对SpringBoot整合Quartz做了初步的介绍以及提供了一个基本的使用例子&#xff0c;因为实际各自的需求任务不尽相同因此并…

redis分布式秒杀锁

-- 获取锁标识&#xff0c;是否与当前线程一致&#xff1f; if(redis.call(get, KEYS[1]) ARGV[1]) then-- 一致&#xff0c;删除return redis.call(del, KEYS[1]) end -- 不一致&#xff0c;直接返回 return 0package com.platform.lock;public interface ILock {/*** 获取锁…

2.5 数字传输系统

笔记&#xff1a; 针对这一节的内容&#xff0c;我为您提供一个笔记的整理方法。将内容按重要性、逻辑关系进行组织&#xff0c;再进行简化。 ## 2.5 数字传输系统 ### 背景介绍&#xff1a; 1. **早期电话网**&#xff1a;市话局到用户采用双绞线电缆&#xff0c;长途干线采…

Ubuntu 20.04使用源码安装nginx 1.14.0

nginx安装及使用&#xff08;详细版&#xff09;是一篇参考博文。 http://nginx.org/download/可以选择下载源码的版本。 sudo wget http://nginx.org/download/nginx-1.14.0.tar.gz下载源代码。 sudo tar xzf nginx-1.14.0.tar.gz进行解压。 cd nginx-1.14.0进入到源代码…

ping使用

使用shell ping一个网段 #!/bin/shfor ib in $(seq 1 254); doip"192.168.1.$ib"(if ping -c3 "$ip" >> 1.txt; thenecho "$ip is alive"fi) &done wait在每次循环的最后&#xff0c;使用 & 将子 shell 放入后台执行&#xff0c…

怒刷LeetCode的第25天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;闭合为环 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;组合数学 方法三&#xff1a;递归 方法四&#xff1a;数学公式 第三题 题目来源 题目内容 解决方法 …

ctfshow-web3(伪协议php://input的利用)

打开题目链接&#xff0c;存在文件包含函数 include 存在文件包含时直接使用PHP伪协议 先介绍一下一个常用的php伪协议&#xff1a; php://input&#xff08;用于执行PHP代码&#xff09; 这是一个只读信息流&#xff0c;当请求方式是post的&#xff0c;并且enctype不等于…

Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)

星光下的赶路人star的个人主页 我的敌手就是我自己&#xff0c;我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数&#xff08;ProcessFunction&#xff09;1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…

Charles:移动端抓包 / windows客户端 iOS手机

一、背景描述 1.1、本文需求&#xff1a;移动端进行抓包调试 1.2、理解Charles可以做什么 Charles是一款跨平台的网络代理软件&#xff0c;可以用于捕获和分析网络流量&#xff0c;对HTTP、HTTPS、HTTP/2等协议进行调试和监控。使用Charles可以帮助开发人员进行Web开发、调试…

【MySQL】Linux 中 MySQL 环境的安装与卸载

文章目录 Linux 中 MySQL 环境的卸载Linux 中 MySQL 环境的安装 Linux 中 MySQL 环境的卸载 在安装 MySQL 前&#xff0c;我们需要先将系统中以前的环境给卸载掉。 1、查看以前系统中安装的 MySQL rpm -qa | grep mysql2、卸载这些 MySQL rpm -qa | grep mysql | args yum …

【Unity】RenderFeature笔记

【Unity】RenderFeature笔记 RenderFeature是在urp中添加的额外渲染pass&#xff0c;并可以将这个pass插入到渲染列队中的任意位置。内置渲染管线中Graphics 的功能需要在RenderFeature里实现,常见的如DrawMesh和Blit ​ 可以实现的效果包括但不限于 后处理&#xff0c;可以编写…