漫谈ApplicationContext和BeanFactory的区别

news2025/1/20 3:36:12

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 

目录

    1.背景介绍    

2.细述ApplicationContext和BeanFactory

3.总结


    1.背景介绍    

        当我们使用SpringBoot创建项目的时候会看到一串代码:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

这串代码就是SpringBoot的启动类,使用@SpringBootApplication修饰。其中

SpringApplication.run(DemoApplication.class, args);

这串代码会让Spring Boot自动扫描并加载所有带有特定注解的类,并自动配置应用程序所需的各种组件。这也就是Spring Boot应用程序的入口,就类似于我们平时写的main入口或者是多线程写的run方法的入口,都算是回调函数。

而这行代码的返回值的类型就是ConfigurableApplicationContext,我们可以用ApplicationContext(ConfigurableApplicationContext的父类)来接收,属于是向上转型,有利于实现低耦合,并且ApplicationContext更加轻量。

2.细述ApplicationContext和BeanFactory

在源码中我们能看到ApplicationContext继承了BeanFactory接口,所以ApplicationContext拥有BeanFactory所有的功能。

那BeanFactory拥有什么功能呢?以下是源码部分:

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

 我们可以看到,在BeanFactory中基本都是对Bean的一些获取属性的一类操作。所以ApplicationContext拥有上面看到的所有内容。并且加入了很多额外的功能,我们看源码可知:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver 

其中加入了MessageSource(国际化的消息访问),ApplicationEventPublisher(事件传递),ResourcePatternResolver(资源加载)。并且BeanFactory和ApplicationContext的最大区别就是ApplicationContext采用的是预加载,它在启动时就把所有的Bean都进行加载,所以启动时间久,但是之后的运行就迅速,不再需要加载Bean,类似于线程池。而BeanFactory采用的是懒加载,它会在使用Bean的时候再加载Bean,这会使运行过程中第一次遇到Bean时会有所卡顿。因为现在的硬盘不值钱了,内存也越来越大,所以现在基本使用的都是ApplicationContext的预加载。

3.总结

总的来说ApplicationContext的功能更加强大更符合当今需求,相比于ConfigurableApplicationContext又更加轻量,所以在当今时代来讲,ApplicationContext是优于BeanFactory的,但是并不是绝对,因为有些场景我们需要启动的快些,不看重运行时的绝对流畅就可以使用BeanFactory。它俩是各有千秋的。

制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!

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

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

相关文章

123.Android 简单的定位和语音识别 免费高德定位 免费语音识别 不需要接入SDK 不需要导入任何的离线包

//免费的定位 高德定位 不需要接入高德SDk也可进行高德定位&#xff1a; //免费的语音识别 不需要接入任何的SDK 也不需要导入任何的离线语音包&#xff1a; //CSDN 小妞得意 //具体代码实现 私聊 //---------------------------------------------------------------END…

Ubuntu 使用nginx部署agular项目

我的front-end是用的webpack&#xff0c;就直接执行的npm run build打包。 完成之后就可以\target\classes\static找到 &#xff0c;直接把整个static上传到需要部署的地方就可以了。 当然这个打包output路径也是angular.json配置好了的 sudo apt update sudo apt install n…

设计模式之开放封闭原则

文章目录 定义理解 小结 定义 开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的&#xff0c;但对于修改是封闭的。这意味着应该用抽象定义结构&#xff0c;用具体实现扩展细节&#xff0c;以此确保软件系统开发和维护过程的可靠性。 理解 怎么理解这个呢&#x…

51-48 CVPR 2024 | Vlogger: make your dream a vlog 自编剧制作视频博客

24年1月&#xff0c;上海交大、上海人工智能实验室、中科院联合发布Vlogger&#xff1a;make your dream a vlog。该论文主要工作是生成超过5分钟的视频博客vlog。鉴于现有文本到视频T2V生成方法很难处理复杂的故事情节和多样化的场景&#xff0c;本文提出了一个名为Vlogger的通…

Photoshop 2022 for Mac/win:释放创意,打造专业级的图像编辑体验

在数字图像编辑的世界里&#xff0c;Adobe Photoshop 2022无疑是那颗璀璨的明星。这款专为Mac和Windows用户设计的图像处理软件&#xff0c;以其卓越的性能和丰富的功能&#xff0c;赢得了全球数百万创作者的青睐。 Photoshop 2022在继承前代版本强大功能的基础上&#xff0c;…

Unity图文混排EmojiText的使用方式和注意事项

​​​​​​​ 效果演示&#xff1a; 使用方式&#xff1a; 1、导入表情 2、设置图片格式 3、生成表情图集 4、创建/修改目标材质球 5、测试 修复换行问题 修复前&#xff1a; 修复后&#xff1a; 修复代码&#xff1a; 组件扩展 1、右键扩展 2、组件归类&#…

力扣题目:机器人能否返回原点

力扣题目&#xff1a;机器人能否返回原点 题目链接: 657.机器人能否返回原点 题目描述 代码思路 题目思路很简单&#xff0c;只要L数量等于R&#xff0c;U的数量等于D。 代码纯享版 class Solution {public boolean judgeCircle(String moves) {int LR 0, UD 0;for(int …

贝叶斯分类器详解

1 概率论知识 1.1 先验概率 先验概率是基于背景常识或者历史数据的统计得出的预判概率&#xff0c;一般只包含一个变量&#xff0c;例如P(A)&#xff0c;P(B)。 1.2 联合概率 联合概率指的是事件同时发生的概率&#xff0c;例如现在A,B两个事件同时发生的概率&#xff0c;记…

next水和错误

产生原因 应该是和预渲染有关&#xff0c;官方也有谈到 水和错误主要原因 这个主要事服务器端渲染和客户端渲染结果不一致&#xff0c;客户端再渲染导致的错误&#xff0c;主要结果就是耗费性能&#xff0c;当然也可以关闭提示错误 具体解决措施可以看看官方文档参考 相关的…

Vagrant + docker搭建Jenkins 部署环境

有人问&#xff0c;为什么要用Jenkins&#xff1f;我说下我以前开发的痛点&#xff0c;在一些中小型企业&#xff0c;每次开发一个项目完成后&#xff0c;需要打包部署&#xff0c;可能没有专门的运维人员&#xff0c;只能开发人员去把项目打成一个war包&#xff0c;可能这个项…

2024年5月10日有感复盘

2024年5月10日有感复盘 时间 今天是一个很美好的一天&#xff0c;原因是很平凡&#xff0c;读书很平凡&#xff0c;玩游戏很平凡&#xff0c;然后生活很平凡&#xff0c;未来可期&#xff0c;听歌很舒服&#xff0c;很喜欢一个人呆在图书馆的感觉&#xff0c;很喜欢发呆&…

VLM与基础分割模型的联合使用

最近做的项目里有涉及大模型&#xff0c;里面有一部分的功能是&#xff1a; 将图片输入VLM(视觉语言模型&#xff0c;我使用的是llava)&#xff0c;询问图中最显著的物体&#xff0c;将其给出的答案作为基础分割模型&#xff08;我使用的是Grounded-SAM&#xff09;的text prom…

SEMI启动SiC专有技术项目

公司郑重声明&#xff0c;其正致力于筛选那些能够稳定输出、且可重复使用的关键参数性能。SEMI&#xff0c;这家SiC领域的佼佼者&#xff0c;已经启动了一项独具匠心的专有技术&#xff08;KGD&#xff09;筛选程序。该程序旨在为客户提供高品质的、经过严格电气分类与光学检验…

重写muduo之Buffer

1、 Buffer.h Buffer封装 是一个缓冲区 prependable bytesreadable byteswritable bytes8字节长度&#xff08;解决粘包问题&#xff09;读数据写数据 根据下标进行读或者写 3个成员变量&#xff1a;数组&#xff0c;数据可读的下标&#xff0c;数据可写的下标 #pragma once#…

打印图案(金字塔)头歌作业

题目: 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;输出堆叠式的金字塔图案。 输入n个字符&#xff0c;按以下原则输出&#xff1a;【参考样例】 1)第1个字符为一层金字塔图案&#xff0c;第2个字符为两层金字塔图案&#xff0c;第3个字符为三层金字塔图案&#x…

C语言——文件缓冲区

一、用户缓冲区和系统缓冲区 缓冲区的概念确实可以分为多个层次&#xff0c;其中最常见的两个层次是用户缓冲区和系统缓冲区。 这里的用户缓冲区和系统缓冲区都包括输入输出缓冲区。 1、用户缓冲区&#xff08;User-space Buffer&#xff09; 用户缓冲区是指由用户程序&…

使用 Spring Boot 配合策略模式增强系统接口扩展能力

使用 Spring Boot 配合策略模式增强系统接口扩展能力 在软件开发中&#xff0c;系统的可扩展性是一个至关重要的方面。而策略模式是一种常见的设计模式&#xff0c;它可以帮助我们实现灵活的算法选择和系统功能扩展。结合 Spring Boot 框架&#xff0c;我们可以更加方便地利用策…

AVL 树的理解和简单实现

目录 1. AVL 树 1.1. AVL 树的概念 1.2. AVL 树的性质 2. AVL 树的框架如下 2. AVL树的 插入 2.1. 平衡因子的更新 2.2.1. 平衡因子更新的第一种情况 2.2.2. 平衡因子更新的第二种情况 2.2.3. 平衡因子更新的第三种情况 2.2.4. 平衡因子更新的代码框架如下 2.2. AV…

十一、Redis持久化-RDB、AOF

Redis提供了两种持久化数据的方式。一种是RDB快照&#xff0c;另一种是AOF日志。RDB快照是一次全量备份&#xff0c;AOF日志是连续的增量备份。RDB快照是以二进制的方式存放Redis中的数据&#xff0c;在存储上比较紧凑&#xff1b;AOF日志记录的是对内存数据修改的指令文本记录…