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

Spring基础分析02-BeanFactory与ApplicationContext

大家好,今天和大家一起学习整理一下Spring 的BeanFactory和ApplicationContext内容和区别~

BeanFactory和ApplicationContext是Spring IoC容器的核心组件,负责管理应用程序中的Bean生命周期和配置。我们深入分析一下这两个接口的区别、使用场景及其提供的功能。控制反转是Spring最为人所知的特性之一,

Spring IoC容器是用来管理和创建Bean实例的工具。它提供了两种主要的接口:BeanFactory和ApplicationContext。虽然两者都实现了基本的Bean工厂功能,但它们之间存在显著差异,适用于不同的应用场景。

BeanFactory详解

BeanFactory的基本概念

BeanFactory是Spring IoC容器的基础接口,提供了获取Bean的最基本方法。它是一个延迟初始化的容器,在首次请求某个Bean时才会去创建它。这意味着如果应用程序中有许多未使用的Bean,那么使用BeanFactory可以节省内存资源,因为它不会一次性加载所有Bean。

BeanFactory的实现类

最常用的BeanFactory实现类是DefaultListableBeanFactory,它提供了对Bean定义的解析、Bean实例化等功能。此外,还有其他几种实现类,如XmlBeanFactory,用于从XML文件中读取Bean定义。

// 创建BeanFactory实例并加载Bean定义
BeanFactory factory = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader((DefaultListableBeanFactory) factory).loadBeanDefinitions("classpath:beans.xml");// 获取Bean实例
MyBean myBean = (MyBean) factory.getBean("myBean");

BeanFactory的功能特点

  • 懒加载:默认情况下,BeanFactory采用懒加载策略,即只有当需要某个Bean时才会去创建它。
  • 轻量级:相比ApplicationContext,BeanFactory更轻量,适合于资源受限的环境或只需要简单Bean管理的应用。
  • 有限的服务支持:BeanFactory只提供基本的Bean生命周期管理和依赖注入功能,不包括诸如AOP、事件发布等高级服务。

ApplicationContext详解

ApplicationContext的基本概念

ApplicationContext是BeanFactory的子接口,除了继承了父接口的所有功能外,还增加了许多额外的功能和服务。它不仅是一个Bean工厂,还是一个应用上下文,能够处理国际化消息、事件传播、资源加载等任务。ApplicationContext在启动时会预加载所有的单例Bean,确保它们已经准备好供后续使用。

ApplicationContext的实现类

ApplicationContext有多种实现类,每种实现类都有其特定用途:

  • ClassPathXmlApplicationContext:从类路径下的XML文件加载Bean定义。
  • FileSystemXmlApplicationContext:从文件系统中的XML文件加载Bean定义。
  • AnnotationConfigApplicationContext:基于注解配置,不需要XML文件。
  • WebApplicationContext:专为Web应用设计,通常由Web容器自动创建。

// 使用ClassPathXmlApplicationContext从类路径加载Bean定义

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

// 获取Bean实例

MyBean myBean = context.getBean("myBean", MyBean.class);

ApplicationContext的功能特点

  • 预加载单例Bean:ApplicationContext在启动时会预加载所有的单例Bean,保证它们随时可用。
  • 丰富服务支持:除了基本的Bean生命周期管理外,还提供AOP、事件监听、国际化消息、资源加载等高级服务。
  • 事件驱动模型:ApplicationContext支持发布/订阅模式,使得不同组件之间可以通过事件进行通信。
  • 国际化支持:内置了对多语言支持的能力,方便构建全球化应用。
  • 便于集成第三方库:更容易与JNDI、EJB等其他技术栈集成。

BeanFactory vs ApplicationContext

特性

BeanFactory

ApplicationContext

加载时机

延迟加载

预加载单例Bean

重量级程度

轻量级

较重

服务支持

仅限基本Bean管理

包括AOP、事件监听、国际化等

适用场景

资源受限环境或小型应用

大型复杂应用

选择BeanFactory还是ApplicationContext取决于具体的应用需求。如果应用相对简单,或者运行在一个资源非常有限的环境中,那么BeanFactory可能是更好的选择。然而,对于大多数线上应用来说,ApplicationContext提供的额外功能和服务往往更加实用和必要。

代码分析

为了更好地理解BeanFactory和ApplicationContext的区别及用法,我们来看几个具体的代码。

使用BeanFactory

假设我们有一个简单的HelloWorld类作为Bean。

public class HelloWorld {private String message;public void setMessage(String message) {this.message = message;}public void getMessage() {System.out.println("Message : " + message);}
}

接下来,我们将使用BeanFactory来创建并管理这个Bean。

使用ApplicationContext

现在看看如何使用ApplicationContext。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {// 加载Bean定义ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 获取Bean实例HelloWorld obj = (HelloWorld) context.getBean("helloWorld");// 调用Bean的方法obj.getMessage();}
}

这段代码几乎与之前的BeanFactory示例相同,唯一的区别在于我们使用了ApplicationContext来代替BeanFactory。但是,当运行这段代码时,会发现ApplicationContext会在启动时预加载所有的单例Bean,而不仅仅是按需加载。

此外,ApplicationContext还提供了更多的服务和支持。例如,你可以轻松地实现事件监听器:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;public class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("Application context refreshed.");}
}

然后将其注册到Spring配置中:

<beans ...>

    <!-- 其他Bean定义 -->

    <bean class="com.example.ContextRefreshListener"/>

</beans>

每当应用上下文刷新时,都会触发ContextRefreshListener中的onApplicationEvent方法,打印一条消息到控制台。

BeanFactory和ApplicationContext都是Spring IoC容器的重要组成部分,各自有着独特的特性和适用场景。BeanFactory更适合那些追求极致性能和资源效率的应用,而ApplicationContext则因其丰富的功能集成为大多数Java应用的首选。欢迎大家一起讨论~

相关文章:

Spring基础分析02-BeanFactory与ApplicationContext

大家好&#xff0c;今天和大家一起学习整理一下Spring 的BeanFactory和ApplicationContext内容和区别~ BeanFactory和ApplicationContext是Spring IoC容器的核心组件&#xff0c;负责管理应用程序中的Bean生命周期和配置。我们深入分析一下这两个接口的区别、使用场景及其提供…...

Rerender A Video 技术浅析(五):对象移除与自动配色

Rerender A Video 是一种基于深度学习和计算机视觉技术的视频处理工具&#xff0c;旨在通过智能算法对视频进行重新渲染和优化。 一、对象移除模块 1. 目标检测 1.1 概述 目标检测是对象移除的第一步&#xff0c;旨在识别视频中需要移除的对象并生成相应的掩码&#xff08;m…...

Java项目实战II基于微信小程序的小区租拼车管理信息系统 (开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;小区居民对于出行方…...

【数字花园】数字花园(个人网站、博客)搭建经历汇总教程

目录 写在最最前面第一章&#xff1a;netlify免费搭建数字花园相关教程使用的平台步骤信息管理 第二章&#xff1a;本地部署数字花园数字花园网站本地手动部署方案1. 获取网站源码2.2 安装 Node.js 3. 项目部署3.1 安装项目依赖3.2 构建项目3.3 启动http服务器 4. 本地预览5. 在…...

WebRTC服务质量(03)- RTCP协议

一、前言&#xff1a; RTCP&#xff08;RTP Control Protocol&#xff09;是一种控制协议&#xff0c;与RTP&#xff08;Real-time Transport Protocol&#xff09;一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息&#xff0c;WebRTC应用…...

STM32F103单片机HAL库串口通信卡死问题解决方法

在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法&#xff0c;在测试的过程中无意间发现&#xff0c;串口会出现卡死的问题。 当串口一次性发送十几个数据的时候&#xff0c;串口感觉像卡死了一样&#xff0c;不再接收数据…...

Scala正则表达式

一、定义&#xff1a;正则表达式是一种用于匹配、查找和替换文本中特定模式的字符串。 使用方式&#xff1a;①定义一个正则 正则表达式应用场景&#xff1a;查找、验证、替换。 Ⅰ、查找 在目标字符串中&#xff0c;找到符合正则表达式规则要求的 子串。 方括号&#xff…...

每日一刷——二叉树的构建——12.12

第一题&#xff1a;最大二叉树 题目描述&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 我的想法&#xff1a; 我感觉这个题目最开始大家都能想到的暴力做法就是遍历找到数组中的最大值&#xff0c;然后再遍历一遍&#xff0c;把在它左边的依次找到最大…...

Redis配置文件中 supervised指令

什么是Supervised&#xff1f; supervised模式允许Redis被外部进程管理器监控。通过这个选项&#xff0c;Redis能够在崩溃后自动重启&#xff0c;确保服务的高可用性。常见的进程管理器包括systemd和upstart。 开启方法 vim修改&#xff1a; sudo vi /etc/redis/redis.conf…...

OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 优化对应点的坐标。 cv::correctMatches 是 OpenCV 库中的一个函数&#xff0c;用于根据基础矩阵&#xff08;Fundamental Matrix&#xff09;校…...

python脚本:向kafka数据库中插入测试数据

# coding:utf-8 import datetime import json import random import timefrom kafka import KafkaProducer生产者demo向branch-event主题中循环写入10条json数据注意事项&#xff1a;要写入json数据需加上value_serializer参数&#xff0c;如下代码producer KafkaProducer(val…...

10. 高效利用Excel导入报警信息

高效利用Excel导入报警信息 1.添加报警服务器2.导出报警EXCEL3.报警控件使用1.添加报警服务器 右键项目名称——Add New Sever——Tag Alarm and Event Sever 给报警服务器命名Alarm 给报警服务器分配优先级。如果想要使能历史的话需要和SQL sever配合使用,之前写过。记住这…...

k8s service 配置AWS nlb load_balancing.cross_zone.enabled

在Kubernetes中配置NLB&#xff08;Network Load Balancer&#xff09;的跨区域负载均衡&#xff08;cross-zone load balancing&#xff09;&#xff0c;需要使用服务注解&#xff08;service annotations&#xff09;来实现。根据AWS官方文档&#xff0c;以下是配置NLB跨区域…...

国标GB28181网页直播平台EasyGBS国标GB28181-2016协议解读:媒体流保活机制

GB28181-2016在为视频监控系统提供统一的网络视频传输协议。这项标准主要用于公共安全视频监控系统&#xff0c;支持视频监控设备间的互联互通。其主要应用场景包括城市公共安全监控、交通监控、消防监控等。 GB28181-2016标准中的媒体流保活机制&#xff0c;主要是在确保视频…...

面试经验分享 | 杭州某安全大厂渗透测试岗

目录&#xff1a; 所面试的公司&#xff1a;某安全大厂   所在城市&#xff1a;杭州    面试职位&#xff1a;渗透测试工程师    面试过程&#xff1a;  面试官的问题&#xff1a;    1、面试官开始就问了我&#xff0c;为什么要学网络安全&#xff1f;   …...

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…...

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...

Qt-chart 画折线图(以时间为x轴)

上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…...

【入门】晶晶的补习班

描述 晶晶上初中了。妈妈认为晶晶应该更加用功学习&#xff0c;所以晶晶除了上学之外&#xff0c;还要参加妈妈为她报名的各科补习班。晶晶的妈妈给了晶晶的下周每天上补习班的小时数&#xff0c;晶晶同学想知道&#xff0c;下周平均一天要上多少小时的补习班&#xff08;结果…...

c#动态更新替换json节点

需求项目json作为主模板&#xff0c;会应用到多个子模版&#xff0c;当后续项目变更只需要修改主模板中节点&#xff0c;并且能够动态更新到原来的子模版中去。 主模板示例&#xff1a; {"A": {"A1": "","A2": false,"A3"…...

cf补题日记

听退役选手建议&#xff0c;补40道C、D题。 &#xff08;又又又开新专题。。。 进度&#xff1a;2/40 原题1&#xff1a; You are given a string ss, consisting of digits from 00 to 99. In one operation, you can pick any digit in this string, except for 00 or the…...

Golang学习笔记_01——包

文章目录 包&#xff08;package&#xff09;1. 定义2. 导入3. 初始化4. 可见性4. 注意4.1 包声明4.2 main包4.3 包的导入4.4标识符的可见性4.5 包的初始化4.6 避免命名冲突4.7 包的路径和名称4.8 匿名导入4.9 使用Go Modules 包&#xff08;package&#xff09; 在Golang&…...

RPC设计--应用层缓冲区,TcpBuffer

为什么需要应用层的buffer 为了方便数据处理&#xff0c;从fd上直接读写然后做包的组装、拆解不够方便方便异步发送&#xff0c;将数据写到应用层buffer后即可返回&#xff0c;让epoll即event_loop去异步发送。提高发送效率&#xff0c;多个小包可合并发送 buffer 设计 可以…...

基于单片机智能控制的饮水机控制系统

基于单片机智能控制的饮水机控制系统&#xff0c;以STC89C52单片机为核心&#xff0c;利用防水型DS18B20温度传感器对饮水机内的水温做出检测&#xff0c;其次利用水位传感器对饮水机内的水量做出检测&#xff0c;并显示在OLED液晶显示屏上。用户在使用饮水机时&#xff0c;通过…...

路径规划 | 改进的人工势场法APF算法进行路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 改进的人工势场法&#xff08;APF&#xff09;路径规划算法 在路径规划中&#xff0c;人工势场法&#xff08;APF&#xff09;是一种常见的方法&#xff0c;但传统的APF算法容易陷入局部极小值&#xff0c;导致路径规…...

【云原生知识】Kubernets实践-前端服务如何访问后端服务

文章目录 概述步骤1&#xff1a;部署后端服务步骤2&#xff1a;配置Nginx步骤3&#xff1a;创建Nginx服务总结 如何确保 Nginx 能持续访问后端服务&#xff1f;相关文献 概述 假设你正在使用Kubernetes作为容器云平台&#xff0c;以下是如何配置Nginx以及相关服务&#xff0c;…...

【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明

参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分&#xff1a; EasyCwmp 核心&#xff1a;它包括 TR069 CWMP 引擎&#xff0c;负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel&#xff1a;它包…...

使用Jackson库的ObjectMapper类将JSON字符串转换为Java的Map对象

本教程展示如何使用Jackson库的ObjectMapper类将JSON字符串转换为Java的Map对象。 下面是具体的步骤和代码示例&#xff0c;包括添加依赖项以及编写用于反序列化JSON字符串为Map的代码。 添加依赖项 首先&#xff0c;在你的项目中添加Jackson库的依赖。如果你使用的是Maven构…...

ASP.NET Core实现鉴权授权的几个库

System.IdentityModel.Tokens.Jwt 和 Microsoft.AspNetCore.Authentication.JwtBearer 是两个常用的库&#xff0c;分别用于处理 JWT&#xff08;JSON Web Token&#xff09;相关的任务。它们在功能上有一定重叠&#xff0c;但侧重点和使用场景有所不同。 1. System.IdentityM…...

MySql:数据类型

✨✨作者主页&#xff1a;嶔某✨✨ ✨✨所属专栏&#xff1a;MySql✨✨ 数据类型分类 分类数据类型说明数值类型BIT(M)位类型&#xff0c;M指定位数&#xff0c;默认值1&#xff0c;范围1~64TINYINT [UNSIGNED]占用一个字节&#xff0c;带符号的范围 -128~127&#xff0c;无符…...

做名片哪个网站最好/优化推广方案

本代码由广州75中麻玉国老师分享在NOI教练群内&#xff0c;自己亲测了一下&#xff0c;感觉蛮好玩&#xff0c;所以特意收藏下来&#xff0c;具体代码如下&#xff1a;import pdfplumberfrom openpyxl import Workbookwb Workbook() # 创建文件对象ws wb.active # 获取第一…...

宜宾seo网站建设/网络推广途径

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同&#xff1a;二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快&#xff0c;且使用的系统和事务日志资源少。 DELETE 语句每次删除一行&#xff0c;并在事务日志中为所删除的每行记录一项。TRUNCATE T…...

做网站卖装备/网页设计页面

有需求请评论或私信 可远程调试 基于PHP的毕设双选管理系统一 介绍 此毕设双选管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为学生&#xff0c;教师&#xff0c;审核员和管理员。系统核心流程为&#xff1a;学生提交选题申请后由教师…...

哪家网站建设公司靠谱/手机百度正式版

今天在看王爽的《汇编语言》&#xff0c;看到地址总线的时候&#xff0c;由于那个图画的是并行传输&#xff0c;于是我就去搜了下地址总线是不是并行总线&#xff0c;结果看到一篇文章说现在串行总线的传输速度比并行总线要快&#xff0c;我就奇怪了。 在我的印象中&#xff0c…...

徐州网站建设青州陈酿/余姚seo智能优化

语法array preg_grep ( string $pattern, array $input [, int $flags] );定义和用法返回给定数组input中与模式pattern 匹配的元素组成的数组.如果将flag设置为PREG_GREP_INVERT, 这个函数返回输入数组中与 给定模式pattern不匹配的元素组成的数组.返回值返回给定数组input中与…...

专门做优选的网站/深圳推广服务

我们知道&#xff0c;swoole中有两大进程&#xff0c;分别是 master 主进程和 manager 管理进程。 (推荐学习&#xff1a;swoole视频教程)其中 master 主进程中会有一个主 reactor 线程和多个 reactor 线程&#xff0c;主要的作用就是用来维护TCP连接&#xff0c;处理网络IO&am…...