解锁ApplicationContext vs BeanFactory: 谁更具选择性?
目录
一、聚焦源码回顾
(一)源码分析和理解
(二)简短的回顾对比建议
二、ApplicationContext vs BeanFactory特性对比
(一)主要特性总结
(二)直接建议
三、案例简单说明
(一)加载少量的 Bean的案例
(二)简单的命令行工具:用于读取配置文件并生成报告
(三)启动时加载大量的配置信息,并且在运行时需要动态地获取一些 Bean
四、总结
干货分享,感谢您的阅读!
在现代软件开发中,框架的选择往往会影响项目的成功与否。作为开发者,我们常常面临着是否深入理解底层实现的两难选择。比如,当我们在 Spring 框架中犹豫是使用 ApplicationContext
还是 BeanFactory
时,选择不仅仅是技术问题,更是对未来项目扩展性和维护性的考量。
透彻的源码分析不仅能够帮助我们理解框架的设计理念,还能让我们在实际开发中灵活应对各种需求变化。因此,本文将带领您深入探讨 ApplicationContext
与 BeanFactory
的特性和使用场景,通过实际案例展示如何选择合适的工具,以优化您的开发过程。
一、聚焦源码回顾
聚焦源码回顾的意义在于深入理解框架的内部机制和设计思想。通过仔细研究源码,可以了解框架的实现细节、各个组件之间的交互关系以及解决问题的方法,也就有助于更好地利用框架的功能,解决实际的开发问题,并且能够更加灵活地进行定制和扩展。
(一)源码分析和理解
在 Spring 官方文档中中,虽然没有明确的建议说应该优先选择 ApplicationContext
还是 BeanFactory
,但是可以通过文档中的描述来理解它们的区别和用途。我们之前对这两部分进行了重新的学习和总结,具体见如下表格:
具体博客总结 | 直接学习链接 |
重看Spring聚焦BeanFactory分析 | 重看Spring聚焦BeanFactory分析-CSDN博客 |
重看Spring聚焦ApplicationContext分析 | 重看Spring聚焦ApplicationContext分析-CSDN博客 |
(二)简短的回顾对比建议
直接简短总结来看的话,可以这样对比一下:
-
BeanFactory:Spring 框架的中心接口,提供了高级配置机制来管理任何类型的对象,主要作用是提供依赖注入和基本的对象生命周期管理功能。
-
ApplicationContext:
BeanFactory
的一个子接口,它扩展了BeanFactory
的功能,提供了更多的企业级功能和特性。它是 Spring 的核心容器,用于加载应用程序的配置文件,并管理 Bean 的生命周期。
从简单的对比可以看出,ApplicationContext
提供了比 BeanFactory
更多的功能和特性,因此在实际开发中,通常优先选择 ApplicationContext
。但具体选择取决于项目的需求和场景。
二、ApplicationContext vs BeanFactory特性对比
(一)主要特性总结
一个简单的表格,用于比较 ApplicationContext
和 BeanFactory
的主要特性:
特性 | ApplicationContext | BeanFactory |
---|---|---|
自动装配 | 支持 | 支持 |
延迟初始化 | 支持 | 部分支持,需要手动配置 |
国际化消息处理 | 支持 | 部分支持,需要手动配置 |
事件发布 | 支持 | 部分支持,需要手动配置 |
AOP 配置 | 支持 | 部分支持,需要手动配置 |
安全性配置 | 支持 | 部分支持,需要手动配置 |
嵌套 ApplicationContext | 支持 | 部分支持,需要手动配置 |
Web 应用上下文 | 支持 | 部分支持,需要手动配置 |
缓存功能 | 支持(如注解缓存) | 部分支持,需要手动配置 |
加载应用程序上下文的方式 | 通过类路径、文件系统、Web 应用程序上下文等方式加载 | 通过类路径、文件系统等方式加载 |
扩展点 | 提供多个扩展点和插件接口,可轻松扩展其功能 | 较少的扩展点,相对较难扩展功能 |
适用场景 | 适用于大多数企业级应用开发,提供更多的功能和特性 | 适用于简单的应用场景,对资源要求较低,不需要使用额外的功能和特性 |
(二)直接建议
从这个表格来看,ApplicationContext
显然提供了更多的功能和特性,而且更适合复杂的企业级应用开发。它提供了自动装配、延迟初始化、国际化消息处理、事件发布、AOP 配置等多种功能,同时支持多种加载应用程序上下文的方式,具有更强的灵活性和扩展性。
相比之下,BeanFactory
虽然也提供了基本的依赖注入和对象生命周期管理功能,但功能相对较少,适用于简单的应用场景或对资源要求较低的情况。
所以总的来说大家会更倾向于推荐使用 ApplicationContext
,因为它提供了更丰富的功能和更多的特性,能够更好地满足现代企业级应用开发的需求。当然,在一些特定的情况下,如资源有限或者对功能要求不高的情况下,选择 BeanFactory
也是可以的,但通常情况下 ApplicationContext
是更好的选择。
三、案例简单说明
(一)加载少量的 Bean的案例
假设我们正在开发一个简单的命令行应用程序,该应用程序只需要加载少量的 Bean,并且对于额外的功能需求并不是很高。在这种情况下,选择 BeanFactory
可能更为合适。
假设我们的 beans.xml
文件位于类路径(classpath)下的 src/main/resources
目录下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个名为 "helloWorld" 的 Bean --><bean id="helloWorld" class="org.zyf.javabasic.spring.beanFactory.HelloWorld"/>
</beans>
xmlns
和 xsi:schemaLocation
是 XML 命名空间和模式位置,用于指定 XML 文件的命名空间和 XML Schema 的位置。这些是标准的 Spring XML 配置文件头部。该 XML 配置文件定义了一个名为 helloWorld
的 Bean,它是一个 HelloWorld
类型的对象,简单定义如下:
package org.zyf.javabasic.spring.beanFactory;/*** @program: zyfboot-javabasic* @description: HelloWorld* @author: zhangyanfeng* @create: 2024-04-13 13:03**/
public class HelloWorld {public void sayHello() {System.out.println("Hello, World!");}
}
现在我们测试验证如下:
package org.zyf.javabasic.spring.beanFactory;import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;/*** @program: zyfboot-javabasic* @description: 选择 BeanFactory 可能更为合适。* @author: zhangyanfeng* @create: 2024-04-13 12:59**/
@Log4j2
public class BeanFactoryBetterTest {public static void main(String[] args) {// 创建 BeanFactoryBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));// 获取 BeanHelloWorld helloWorld1 = (HelloWorld) beanFactory.getBean("helloWorld");// 使用 BeanhelloWorld1.sayHello();// 创建 ApplicationContextApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 获取 BeanHelloWorld helloWorld2 = (HelloWorld) context.getBean("helloWorld");// 使用 BeanhelloWorld2.sayHello();}
}
虽然我们可以使用 ApplicationContext
来达到同样的效果,但在这种简单的情况下,选择 BeanFactory
更为轻量级,不需要加载额外的功能和特性,更加简洁明了。
然而,如果应用程序的需求变得更加复杂,需要更多的功能和特性(如自动装配、事件发布、AOP 配置等),或者需要集成其他 Spring 框架或第三方框架,那么使用 ApplicationContext
将更为合适。
(二)简单的命令行工具:用于读取配置文件并生成报告
假设有一个简单的命令行工具,用于读取配置文件并生成报告。在这个工具中,我们可能只需要加载一些配置信息,而不需要使用 Spring 框架提供的更复杂的功能。在这种情况下,使用 BeanFactory
可能更为合适。
假设我们有一个简单的配置文件 report-config.xml
,其中包含了一些报告生成的配置信息,如数据库连接信息、报告格式等。下面是一个简化的示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 数据库连接信息 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/zyf"/><property name="username" value="zyf"/><property name="password" value="Zyf76#56uhb&@sh%hd567ijhfg"/></bean><!-- 报告生成器 --><bean id="reportGenerator" class="org.zyf.javabasic.spring.beanFactory.ReportGenerator"><property name="dataSource" ref="dataSource"/><!-- 其他配置属性 --></bean>
</beans>
在这个示例中定义了一个 dataSource
使用Spring提供的 DriverManagerDataSource
类来创建数据库连接。现在定义一个自定义的 ReportGenerator
类,用于生成报告:
package org.zyf.javabasic.spring.beanFactory;import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;/*** @program: zyfboot-javabasic* @description: 调用其方法来生成报告* @author: zhangyanfeng* @create: 2024-04-13 13:52**/
public class ReportGenerator {private DataSource dataSource;// setter 方法用于接收 dataSource 属性的注入public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}public void generateReport() {// 使用 JdbcTemplate 连接数据库JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);// 查询数据库并生成报告String sql = "SELECT * FROM user20240413";jdbcTemplate.query(sql, (rs, rowNum) -> {String username = rs.getString("username");String email = rs.getString("email");System.out.println("Username: " + username + ", Email: " + email);return null;});System.out.println("Report generated successfully.");}
}
对于这样一个简单的命令行工具,我们可能只需要加载这些配置信息,然后创建一个 ReportGenerator
实例,并调用其方法来生成报告。在这种情况下,使用 BeanFactory
就足够了,因为我们不需要 Spring 提供的更多的高级功能,如自动装配、事件发布等。下面是一个使用 BeanFactory
的示例:
package org.zyf.javabasic.spring.beanFactory;import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;/*** @program: zyfboot-javabasic* @description: 简单的命令行工具* @author: zhangyanfeng* @create: 2024-04-13 13:55**/
public class ReportToolTest {public static void main(String[] args) {// 创建 BeanFactoryBeanFactory beanFactory = new XmlBeanFactory(
new ClassPathResource("report-config.xml"));// 获取 reportGenerator BeanReportGenerator reportGenerator = (ReportGenerator) beanFactory.getBean("reportGenerator");// 使用 reportGenerator 生成报告reportGenerator.generateReport();}
}
在这个示例中,我们使用 BeanFactory
来加载 report-config.xml
文件,并获取了一个 reportGenerator
Bean。然后,我们使用这个 Bean 来调用 generateReport
方法来生成报告。
尽管我们也可以使用 ApplicationContext
来达到同样的效果,但在这种简单的情况下,选择 BeanFactory
更为轻量级和简洁。
(三)启动时加载大量的配置信息,并且在运行时需要动态地获取一些 Bean
假设我们有一个 Spring Boot 应用程序,该应用程序需要在启动时加载大量的配置信息,并且在运行时需要动态地获取一些 Bean,这些 Bean 的创建可能依赖于其他 Bean。在这种情况下,使用 ApplicationContext
会更加方便和灵活。
首先,我们可以将所有的配置信息(如商品信息、用户信息、库存信息等)存储在数据库中。然后,在应用程序启动时,我们使用 ApplicationContext
加载数据库配置,并将其转换为 Spring 的 Bean,并将这些 Bean 注册到应用程序的上下文中。
在用户下单时,我们可以通过 ApplicationContext
获取相应的 Bean(如商品信息、用户信息、库存信息等),并根据用户的选择生成订单。
package org.zyf.javabasic.spring.beanFactory;/*** @program: zyfboot-javabasic* @description: OrderService* @author: zhangyanfeng* @create: 2024-04-13 14:31**/
public class OrderService {private final ApplicationContext context;public OrderService(ApplicationContext context) {this.context = context;}public void placeOrder(String productId, String userId) {// 根据商品 ID 获取商品信息Product product = context.getBean(ProductRepository.class).findById(productId);// 根据用户 ID 获取用户信息User user = context.getBean(UserRepository.class).findById(userId);// 根据商品 ID 获取库存信息Inventory inventory = context.getBean(InventoryService.class).getInventory(productId);// 检查库存是否充足if (inventory.getQuantity() > 0) {// 生成订单逻辑Order order = new Order(user, product);// 省略生成订单的逻辑System.out.println("Order placed successfully.");} else {System.out.println("Insufficient inventory.");}}
}
在这个例子中,OrderService
类使用 ApplicationContext
来获取商品信息、用户信息和库存信息,并根据这些信息生成订单。通过使用 ApplicationContext
,我们可以在运行时动态地获取所需的 Bean,并且不需要在代码中硬编码 Bean 的依赖关系。
总的来说,使用 ApplicationContext
可以使应用程序更加灵活,并且可以在运行时动态地管理和获取 Bean,从而使应用程序更加易于扩展和维护。
四、总结
在本文中,我们深入探讨了 Spring 框架中的 ApplicationContext
和 BeanFactory
的区别及其各自的使用场景。通过源码回顾,我们不仅了解了这两者的设计理念和实现机制,还分析了它们在不同应用场景下的适用性。
首先,我们发现 ApplicationContext
提供了更多的功能和特性,如自动装配、国际化支持和事件发布等,使其更适合复杂的企业级应用。而 BeanFactory
则相对简单,适用于资源有限或功能需求不高的场景。
通过实际案例的分析,我们展示了在不同情况下选择合适的容器的重要性。在简单应用中,BeanFactory
的轻量级特性使其成为不错的选择;而在需要动态获取 Bean 或集成多种功能的情况下,ApplicationContext
无疑是更为强大的工具。
最后,深入理解这些底层实现不仅能帮助我们做出更明智的技术选择,还能提升我们的整体架构思维能力。这在快速发展的技术环境中显得尤为重要,希望读者在今后的开发过程中,能更好地应用所学,提升代码质量和项目效率。
感谢您的阅读,希望本文能够为您在 Spring 开发中提供有价值的参考和帮助!
文章推荐阅读
在程序员的职业规划中,成为软件架构师是一个非常有吸引力的选择。但是对于如何才能成为一名架构师,不少同学认为只要代码写得好,就能得到公司提拔,晋升为架构师。
还真不是这样的,如果不具备架构思维,即使代码能写到极致,在开展工作时也将不可避免地掉到坑里去。例如,看起来面面俱到的设计,但因为太复杂而无法落地;错估需求,导致高射炮打蚊子,浪费资源;实现方案总想毕其功于一役,结果需求变化就要推倒重来。
所以程序员要清醒地认识到,写好代码仅是软件开发过程中的一个环节,把代码写到极致也不会自动成为架构师。架构工作贯穿了软件生命周期,做好架构一定要学会架构思维。
有一本书专门告诉程序员如何培养架构思维——《架构思维:从程序员到CTO》。本书以架构师工作中的痛点问题为导向,结合大量真实、复杂的案例,帮助架构师建立起思考框架,提高架构设计能力,规划职业成长路径。
具体链接如下:
https://item.jd.com/14019725.html
一本书揭秘程序员如何培养架构思维!
相关文章:

解锁ApplicationContext vs BeanFactory: 谁更具选择性?
目录 一、聚焦源码回顾 (一)源码分析和理解 (二)简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 (一)主要特性总结 (二)直接建议 三、案例简单说明 &am…...

一篇梳理清楚http请求知识点
HTTP请求是Web开发中的重要组成部分,它涉及到客户端和服务器之间的通信。掌握HTTP请求的知识点对于前端开发和后端开发都至关重要。以下是关于HTTP请求的详细梳理,结合代码进行说明。 1. HTTP请求概述 HTTP(超文本传输协议)是一个…...

Kotlin - 协程结构化并发Structured Concurrency
前言 Kotlin的Project Lead,Roman Elizarov的一片文章https://elizarov.medium.com/structured-concurrency-722d765aa952介绍了Structured Concurrency发展的背景。相对Kotlin1.1时代,后来新增的Structured Concurrency理念,也就是我们现在所…...

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
经过近3个月的迭代开发,新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了,最新的EasyGBD支持了国标GB28181-2022版,还支持了语音对讲、位置上报、本地录像等功能,比原有GB28181-2016版的EasyGBD更加高效、…...

豆包MarsCode测评:编程效率再提升
豆包MarsCode测评:编程效率再提升 本文正在参与豆包MarsCode AI 编程体验家活动 随着人工智能技术的发展,编程的方式也在悄然发生变化。最近,豆包推出的 AI 编程工具 MarsCode 在开发者社区引发了不小的关注。这是一款支持多种主流编程语言…...

二叉树 -- 堆(详解)
目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素…...

【Apache Paimon】-- 11 -- Flink 消费 kakfa 写 S3 File
目录 1、项目构建 2、项目新增和修改 2.1 pom.xml 新增依赖 2.2 本地测试或者 flink on k8s 时,新增 S3FileSystemFactory.java 第一步:创建包=org.apache.flink.fs.s3hadoop 第二步:新增 java 类 S3FileSystemFactory 特别注意 (1)本地测试时需要新增以下内容 (…...

SQL MID()
SQL中的MID()函数是一个用于从指定位置开始截取字符串中指定长度的子串的函数。这个函数在数据库查询和数据处理中经常被使用,特别是在需要从较长的文本字段中提取特定信息时。 MID()函数的基本语法是:SELECT MID(column_name, start, length) FROM tab…...

jsp | servlet | spring forEach读取不了对象List
导致这个问题的原因有很多的,这里讲到的只是原因之一 原因 taglib不认识forEach 解决办法 添加<% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c" %> (我忘写这个东西了哈哈哈)...

【ArcGIS Pro微课1000例】0063:处理无人机数据(空三、生成DOM、DSM、DTM)
使用ArcGIS Pro 正射拼接处理无人机数据流程化工具,不需要额外产品许可的支持,只需要桌面是高级版许可即可支持。ArcGIS Pro处理无人机摄影测量数据主要内容有:空三、生成DOM、DSM、DTM。 文章目录 一、创建映射项目二、提交自由空三三、添加控制点优化四、提交产品生产一、…...

【pytorch】深度学习计算
1 层和块 块由类(class)表示。它的任何子类都必须定义一个将其输入转换为输出的前向传播函数,并且必须存储任何必需的参数。注意,有些块不需要任何参数。最后,为了计算梯度,块必须具有反向传播函数。 1.1…...

详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
1、什么是I/O 在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为…...

VPN技术-GRE隧道的配置
GRE隧道的配置 1, 在AR1上配置DHCP接口地址池,AR3上配置DHCP全局地址池 2, PC1获取的IP地址为10.10.10.253,PC2获取的IP地址为10.10.30.253 3,通过ip route-static将目的地址为10.10.30.253的流量引入到Tunnel #配…...

【spring-cloud-gateway总结】
文章目录 什么是gateway如何导入gateway依赖路由配置gateway配置断路器导包配置 什么是gateway 在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个…...
数组相关简单算法
目录 1. 数据结构与算法 2. 数组中涉及的算法 2.1 2.2 数值型数组相关运算 2.3 数组赋值 2.4 数组复制/反转 2.5 数组查找 2.6 排序 1. 数据结构与算法 《数据结构与算法》是大学些许专业的必修或选修课,主要包含两方面知识: (1&#…...

在VBA中结合正则表达式和查找功能给文档添加交叉连接
在VBA中搜索文本有两种方式可用,一种是利用Range.Find对象(更常见的形式可能是Selection.Find,Selection是Range的子类,Selection.Find其实就是特殊的Range.Find),另一种方法是利用正则表达式,但…...

动手学深度学习-多层感知机-7前向传播、反向传播和计算图
目录 前向传播 前向传播计算图 反向传播 训练神经网络 小结 我们已经学习了如何用小批量随机梯度下降训练模型。 然而当实现该算法时,我们只考虑了通过前向传播(forward propagation)所涉及的计算。 在计算梯度时,我们只调用…...

【Python】基于Python的CI/CD工具链:实现自动化构建与发布
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,持续集成(CI)和持续交付(CD)已经成为提高开发效率和软件质量的重要实践。CI/CD流程帮助开发团队自动化构建、测试、…...

FPGA-PS端编程1:
目标 在小梅哥的zynq 7015上,完成以下目标: 读取 S1 按键的电平, 当 S1 按键为按下状态时,驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别), 当 S1 释放后,停止…...

自制数据库迁移工具-C版-06-HappySunshineV1.5-(支持南大Gbase8a、PostgreSQL、达梦DM)
目录 一、环境信息 二、简述 三、架构图 四、升级点 五、支持功能 六、后续计划支持功能 七、安装包下载地址 八、配置参数介绍 九、安装步骤 1、用户创建 2、安装包解压 3、环境变量配置 4、环境变量生效 5、动态库链接检验 (1)HsManage…...

了解RPC
本文来自智谱清言 --------- RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用位于远程计算机上的子程序或服务的技术。这种技术使得构建分布式计算变得更加容易,因为它提供了强大的远程调用能力,同时保持…...

centos7 安装docker
文章目录 介绍docker特点安装1.前提准备2.下载1.移除旧版docker命令2.切换centos7的镜像源3.配置docker yum源4.安装最新docker5.输入命令验证docker 安装是否成功6.配置docker 镜像加速7.设置为开机自启 总结 介绍 Docker是一种开源的容器化平台,旨在简化应用…...

Docker 入门:如何使用 Docker 容器化 AI 项目(一)
引言 在人工智能(AI)项目的开发和部署过程中,环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码,确保每个人使用的环境一致,才能避免 “在我的机器上可以运行”的尴尬问题。…...

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读
LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读:这篇论文提出了一种名为rStar的自我博弈互推理方法,用于增强小型语言模型 (SLMs) 的推理能力,无需微调或依赖更强大的模型。rStar…...

【RK3588 Linux 5.x 内核编程】-内核中断与ThreadedIRQ
内核中断与ThreadedIRQ 文章目录 内核中断与ThreadedIRQ1、Threaded IRQ介绍2、Threaded IRQ相关API3、驱动实现4、驱动验证当 Interrupt 触发时,Interrupt handler 应该执行得非常快,它不应该运行更多的时间(它不应该执行耗时的任务)。 如果我们有执行更多任务的中断处理程…...

Message Processing With Spring Integration高级应用:自定义消息通道与端点
一、Spring Integration 简介 Spring Integration 是 Spring 框架的扩展,支持企业集成模式(EIP),提供轻量级的消息处理功能,帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标: 提供简单的模型…...

S32K324 MCAL中的Postbuild和PreCompile使用
文章目录 前言Postbuild和PreCompile的概念MCAL中配置差异总结 前言 之前一直看到MCAL配置中有这个Postbuild和PreCompile的配置,但是不太清楚这两个的区别和使用方法。最近在使用中出现了相关问题,本文介绍一下MCAL中这两种配置的区别和使用。 Postbu…...

kubeadm_k8s_v1.31高可用部署教程
kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配(8台虚拟机)**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...

【AI日记】24.12.22 容忍与自由 | 环境因素和个人因素
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容:看 OpenAi 这周的发布会和其他 AI 新闻,大佬视频时间:3 小时 读书 书名:富兰克林自传时间:1 小时评估:读完,总体…...

【Java基础面试题030】Java和Go的区别?
回答重点 可以从语言的设计理念、并发模型、内存管理、生态系统与应用场景来说: 1)语言设计理念: Java:Java是一种面向对象编程语言,强调继承、多态和封装等OOP特性。它运行在Java虚拟机(JVM)…...