深度理解BeanFactory和ApplicationContext的区别

news2025/1/10 13:09:02

BeanFactory和ApplicationContext 接口及其子类图

在这里插入图片描述
这是Spring一部分的关系类图,从这个类图我们可以大致看出BeanFactory的和ApplicationContext的关系,BeanFactory是ApplicationContext的基类,BeanFactory所拥有的功能,ApplicationContext都拥有, 不仅如此,ApplicationContext还拓展了一些功能, 它通过继承MessageSource、 ResourceLoader等接口,在BeanFactory简单IOC容器的基础上添加了许多高级容器的特征。

BeanFactory

BeanFactory源码

public interface BeanFactory {
    // 根据指定名字获取IOC容器管理的Bean
    Object getBean(String name) throws BeansException;
    // 根据指定名字获取IOC指定的Bean, 并且对Bean的类型进行检查
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;
    // 根据类型获取IOC容器管理的Bean
    <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);
    // 判断容器是否包含指定名字的Bean
    boolean containsBean(String name);
    // 判断指定名字的Bean是否是Singeton(单例)类型
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    // 判断指定名字的Bean是否是Prototype(多例)类型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    // 查询指定名字的Bean的Class类型是否是特定的Class类型.
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    // 查询指定名字的Bean的Class类型
    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    // 查询指定名字的Bean的Class类型
    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    // 查询指定名字的Bean的所有别名, 这些别名都是用户在BeanDefinition中定义的
    String[] getAliases(String name);

可以看到,这里定义的只是一系列的接口方法,为IOC容器提供了使用规范。在这个基础上,Spring还提供了符合IOC容器接口的一系列容器的容器供开发人员使用,我们以XmlBeanFactory的实现为例来说明简单的IOC的设计原理。

XmlBeanFactory相关类图如下
在这里插入图片描述
与ApplicationContext相比,有一个非常明显的特点,就是XmlBeanFactory只提供最基本的IOC容器的功能。

XmlBeanFactory源码

@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {
    // BeanDefinition读取器
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);

    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }

    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        // 载入BeanDefinition
        this.reader.loadBeanDefinitions(resource);
    }

}

可以看到,要使用XmlBeanFactory,我们需要传入Resource对象,即BeanDefinition资源,也就是我们平常写的xml文件。BeanDefinition读取器 XmlBeanDefinitionReader会自动帮我们BeanDefinition载入到IOC容器中供我们使用。

下面我们来使用一下XmlBeanFactory:

@Test
    public void test2 () {
	ClassPathResource classPathResource = new ClassPathResource("application.xml");
	XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(classPathResource);
	Object user = xmlBeanFactory.getBean("user");
	System.out.println(user);
    }

ApplicationContext

我们以ClassPathXmlApplicationContext来探讨ApplicationContext的使用

ClassPathXmlApplicationContext类图

在这里插入图片描述
从类图可以看出,ApplicationContext除了提供基本的BeanFactory的功能外,还为用户提供以下的附加服务,可以让用户更方便地使用。

  • 支持不同的信息源,ApplicationContext扩展了MessageSource接口,这些信息源的扩展功能可以支持国际化的实现,为开发多语言版本的应用提供服务
  • 访问资源。这一特征体现在对ResourceLoader和Resorce的支持上,这样我们可以从不同的地方得到BeanDefinition资源。

ClassPathXmlApplicationContext的使用

  @Test
    public void test3 () {
        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("application.xml");
        Object user = applicationContext.getBean("user");
        System.out.println(user);
    }

总结:

BeanFactory
BeanFactory是spring的原始接口,针对原始结构的实现类功能比较单一,BeanFactory接口实现的容器,特点是在每次获取对象时才会创建对象。

ApplicationContext
继承了BeanFactory接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,每次容器启动时就会创建所有的对象。

创建ApplicationContext的方法:
丛类路径下加载配置文件:ClassPathXmlApplicationContext (“applicationContext.xml”);
从硬盘绝对路径下加载配置文件: FileSystemXmlApplicationContext(“d:/xxx/yyy/xxx”);

结论
早期的电脑性能低,内存小,所以spring容器的容量不足,不能讲所以的对象全部创建好放入容器,所以使用的是BeanFactory,需要某个对象时,再进行创建,随着电脑硬件的发展,内存越来越大,所以spring框架引入了ApplicationContext,将所有的对象都创建好,放入容器,使用哪个对象,从容器中取得即可。

BeanFactory 和ApplicationContext (详细说明)

  • Bean 工厂(com.springframework.beans.factory.BeanFactory)是Spring 框架最核心的接口,它提供了高级IoC 的配置机制。
  • 应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory 基础之上。

几乎所有的应用场合我们都直接使用ApplicationContext 而非底层的BeanFactory。

1. BeanFactory 的类体系结构

BeanFactory: 接口位于类结构树的顶端, 它最主要的方法就是getBean(StringbeanName),该方法从容器中返回特定名称的Bean,BeanFactory 的功能通过其他的接口得到不断扩展。

ListableBeanFactory:该接口定义了访问容器中Bean 基本信息的若干方法,如查看Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一Bean 等方法;

HierarchicalBeanFactory:父子级联IoC 容器的接口,子容器可以通过接口方法访问父容器;

ConfigurableBeanFactory:是一个重要的接口,增强了IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;

AutowireCapableBeanFactory:定义了将容器中的Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法;

SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean 的方法;

BeanDefinitionRegistry:Spring 配置文件中每一个节点元素在Spring 容器里都通过一个BeanDefinition 对象表示,它描述了Bean 的配置信息。而BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法。

2. ApplicationContext 的类体系结构

ApplicationContext 由BeanFactory 派生而来,提供了更多面向实际应用的功能。在BeanFactory 中,很多功能需要以编程的方式实现,而在ApplicationContext 中则可以通过配置的方式实现。
ApplicationContext 的主要实现类是ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。

核心接口包括:
ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了ApplicationListener 事件监听接口的Bean 可以接收到容器事件, 并对事件进行响应处理。在ApplicationContext 抽象实现类AbstractApplicationContext 中,我们可以发现存在一个ApplicationEventMulticaster,它负责保存所有监听器,以便在容器产生上下文事件时通知这些事件监听 者。

MessageSource:为应用提供i18n 国际化消息访问的功能;

ResourcePatternResolver : 所有ApplicationContext 实现类都实现了类似于PathMatchingResourcePatternResolver 的功能,可以通过带前缀的Ant 风格的资源文件路径装载Spring 的配置文件。

LifeCycle:该接口是Spring 2.0 加入的,该接口提供了start()和stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体Bean 实现,ApplicationContext 会将start/stop 的信息传递给容器中所有实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的。

ConfigurableApplicationContext 扩展于ApplicationContext,它新增加了两个主要的方法:refresh()和close(),让ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。这些接口方法为容器的控制管理带来了便利.

代码示例:

ApplicationContext ctx =new ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx =new FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});

ApplicationContext 的初始化和BeanFactory 有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean 时才实例目标Bean;而ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean 。

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

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

相关文章

【Docker 的数据管理和网络通信】

目录 一、Docker 的数据管理1&#xff0e;数据卷2&#xff0e;数据卷容器 二、容器互联&#xff08;使用centos镜像&#xff09;三、Docker 镜像的创建1&#xff0e;基于现有镜像创建&#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改&#xff08;2&#x…

C# Yolo+Onnx 号牌识别

参考 https://github.com/missxingwu/net_yolov5_plate https://github.com/ivilson/Yolov7net https://github.com/we0091234/Chinese_license_plate_detection_recognition 效果 项目 VS2022.net 4.8OpenCvSharp4Microsoft.ML.OnnxRuntime 部分代码 using System; using …

xDS解决的是什么样子的痛点

xDS基本概念 Istio发现模型 xDS是什么 xDS是一类发现服务的总称&#xff0c;包含LDS&#xff0c; RDS&#xff0c; CDS&#xff0c; EDS以及SDS。 Envoy通过xDS API可以动态获取Listener&#xff08;监听器&#xff09;&#xff0c;Route&#xff08;路由&#xff09;&#x…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

性能测试Ⅲ

JMeter里面使用后端监听器&#xff0c;结合influxdb的时序数据库以及grafana可以打造性能测试的平台 后端监听器&#xff1a;把JMeter执行过程中的数据写到influxDB的时序数据库 influxD&#xff1a;时序数据库&#xff0c;用来存储JMeter发送请求的数据 Grafana &#xff1a;从…

k8s容器入门

一、k8s入门 1.什么是容器 降低虚拟机造成的物理主机资源浪费&#xff0c;提高物理主机的利用率&#xff0c;并能提供像虚拟机一样狼好的应用程序隔离运行环境&#xff0c;人们把这种轻量型的虚拟机&#xff0c;称为容器。 2. 容器的管理工具 主要用于容器的创建、启动、关…

优化transformer

使用transformer而导致的时间长&#xff0c;可能会由于self-attention计算Query和key的值才导致的时间长&#xff0c;也可能会因为feed forward中的计算导致时间长。这里我们只针对第一种情况下进行优化。 第一种情况&#xff1a;有些问题&#xff0c;我们可能不需要看整个句子…

Linux安装JDK、Redis、MySQL、RabbitMQ、Minio、Nginx.......

文章目录 一、环境准备二、安装JDK三、安装MySQL四、安装Redis三、安装RabbitMQ四、安装Minio五、安装Nginx特殊情况处理Centos7挂载磁盘服务器时间同步MySQL数据库时间同步安装解压软件修改数据库SQL模式 一、环境准备 下载镜像源 中科大镜像源下载至/opt目录下修改yum源为中…

蓝桥杯专题-真题版含答案-【贪吃蛇长度】【油漆面积】【绘制圆】【高次方数的尾数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

微服务初始

今天准备开始学习微服务&#xff0c;使用微服务肯定是因为他有好处。 首先了解到的三种架构&#xff0c;传统单体&#xff0c;集群架构&#xff0c;微服务架构 单体架构 有单点问题&#xff0c;如果宕机所有的服务都不可用所有业务的功能模块都聚集在一起&#xff0c;如果代…

POSTGRESQL PERPARE 事务提交方式,到底用还是不用

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

单Bank OTA升级:STM32G071 APP (二)

接上一篇文章&#xff1a;单Bank OTA升级&#xff1a;STM32G071 BootLoader (一)&#xff1a;跳转链接 什么是单Bank升级&#xff1a;将Flash划分为以下3个区域。 BootLoader区&#xff1a;程序进行升级的引导程序&#xff0c;根据Upade_Flag来判断跳转Bank区运行程序或是接收…

spring复习:(52)注解方式下,ConfigurationClassPostProcessor是怎么被添加到容器的?

进入AnnotationConfigApplicationContext的构造方法&#xff1a; 进入AnnotatedBeanDefinitionReader的构造方法&#xff1a; 进入this(registry, getOrCreateEnvironment(registry));代码如下&#xff1a; 进入AnnotationConfigUtils.registerAnnotationConfigProcessors方…

贤鱼的刷题日常(数据结构栈学习)-1696:波兰表达式--(递归+栈双题解)题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解1696:波兰表达式 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢迎你…

MySQL用户管理详解

文章目录 用户管理创建用户更改密码mysql的权限分类授权实例撤销权力 mysql检查顺序相关文件信息 用户管理 创建用户 在MySQL中&#xff0c;创建用户是管理和授权数据库访问权限的重要操作。下面是创建用户的详细步骤&#xff1a; 连接到MySQL服务器&#xff1a;使用MySQL客户…

人员定位安全管控系统:提升安全管理水平的智能解决方案

在当今社会&#xff0c;人员安全管理成为各行各业关注的焦点。为了保障人员的安全和提高管理效率&#xff0c;人员定位安全管控系统应运而生。 人员定位安全管控系统采用多种定位技术来实现对人员位置的准确定位&#xff0c;如GPS&#xff08;全球定位系统&#xff09;、Wi-Fi…

强化学习论文《Deep Reinforcement Learning that Matters》笔记

文章目录 1. 简介2. 实验分析超参数网络架构Reward ScaleRandom Seeds and TrailsEnvironmentCodebases 3. Reporting Evaluation MetricsOnline view vs. Policy OptimizationConfidence BoundsPower AnalysisSignificance 4. 结论5. 参考资料 1. 简介 这篇2017年的论文 是强化…

【PHP】phpstudy添加的网站,访问出现 嗯… 无法访问此页面

使用phpstudy创建网站&#xff0c;只有localhost可以访问&#xff0c; 其他所有网站无法访问&#xff0c;可能是你的账户没有修改vhost的权限 找到 C:\Windows\System32\drivers\etc下的vhost文件&#xff0c; 1、右键属性 将只读去掉 2、把用户对此文件的控制权限全部勾上 …

解决直播间源码音视频不同步问题的有效方式

随着网络技术的发展和移动设备的普及&#xff0c;电视、电脑、手机等数码产品越来越智能&#xff0c;我们不管是在家或是在外面都可以运用不同的数码产品去看剧或是短视频等&#xff0c;但可能很多人遇到过这样一种情况&#xff1a;当我们在看剧或是短视频的时候&#xff0c;可…

微信小程序可输入弹窗

addWhite() {wx.showModal({title: 添加白名单,editable: true, // 可输入content: ,complete: (res) > {if (res.confirm) {if (!res.content) { // 输入的值wx.showToast({title: 请填写白名单,icon: error})this.addWhite()}else {// 调接口}}}})},