深入理解Spring的ApplicationContext:案例详解与应用
深入理解Spring的ApplicationContext:案例详解与应用
在Spring框架的丰富生态中,ApplicationContext扮演着至关重要的角色。作为BeanFactory的扩展,ApplicationContext不仅继承了其所有功能,还引入了更多高级特性,使得Spring容器的管理更加灵活和方便。本文将结合CSDN上的一篇热门文章,通过案例学习,带您深入了解ApplicationContext的基础概念和应用场景。
ApplicationContext与BeanFactory的对比
ApplicationContext通常被称为Spring上下文,它是BeanFactory的派生接口,提供了更多面向实际应用的功能。ApplicationContext能够通过配置方式实现许多BeanFactory需要编程实现的功能,使得Spring容器的管理更加灵活和方便。
| 特性 | ApplicationContext | BeanFactory |
|---|---|---|
| 范围 | 企业级 | 基础级 |
| 配置 | 支持消息资源、事件发布等 | 仅支持基础的bean管理 |
| AOP | 内置AOP支持 | 无 |
| 事件 | 支持应用程序事件 | 无 |
| 类型转换 | 提供类型转换服务 | 无 |
案例学习:ApplicationContext的应用
为了更好地理解ApplicationContext,我们将通过一个简单的案例来学习它的使用。我们将创建两个User对象,一个配置为单例(singleton),另一个配置为多例(prototype)。
创建User对象
首先,我们定义一个简单的User类:
@Data
public class User {private String id;private String name;private Integer age;
}
配置ApplicationContext
接下来,我们创建一个名为applicationContext.xml的Spring配置文件:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- singleton --><bean id="UserSingleton" class="com.example.User" scope="singleton"p:id="1" p:name="辰兮" p:age="22"/><!-- prototype --><bean id="UserPrototype" class="com.example.User" scope="prototype"p:id="2" p:name="辰兮要努力" p:age="23"/></beans>
测试ApplicationContext
现在,我们创建一个测试类来学习ApplicationContext的使用:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;public class ApplicationContextDemo {private static final Logger logger = LoggerFactory.getLogger(ApplicationContextDemo.class);public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// Singleton: 单实例User user = applicationContext.getBean("UserSingleton", User.class);User user1 = applicationContext.getBean("UserSingleton", User.class);logger.info("user.hashCode() is:{}", user.hashCode());logger.info("user1.hashCode() is:{}", user1.hashCode());logger.info("user is:{}", user);logger.info("user1 is:{}", user1);logger.info("user == user1 :{}", user == user1);// Prototype: 多实例User user3 = applicationContext.getBean("UserPrototype", User.class);User user4 = applicationContext.getBean("UserPrototype", User.class);logger.info("user3.hashCode() is:{}", user3.hashCode());logger.info("user4.hashCode() is:{}", user4.hashCode());logger.info("user3 is:{}", user3);logger.info("user4 is:{}", user4);logger.info("user3 == user4 :{}", user3 == user4);}
}
执行代码
控制台日志输出将显示单例bean的两个引用指向同一个对象,而多例bean每次获取都是一个新的实例:
user.hashCode() is:1446002
user1.hashCode() is:1446002
user is:User(id=1, name=辰兮, age=22)
user1 is:User(id=1, name=辰兮, age=22)
user == user1 :true
user3.hashCode() is:266875004
user4.hashCode() is:266875004
user3 is:User(id=2, name=辰兮要努力, age=23)
user4 is:User(id=2, name=辰兮要努力, age=23)
user3 == user4 :false
代码逻辑
- 创建Spring的工厂类:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- 通过工厂解析XML获取Bean实例:
User user = (User) applicationContext.getBean("UserSingleton");
拓展补充
- 对象相等则hashCode一定相等;
- hashCode相等对象未必相等。
使用==比较两个对象,可以复习一下Spring作用域相关知识点。
ApplicationContext总结
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能,是“应用的容器”。
结语
通过本文的学习,您应该对ApplicationContext有了更深入的理解。它不仅是Spring框架的核心组件,也是您在构建企业级应用程序时的得力助手。希望本文能够帮助您在实际开发中更好地利用ApplicationContext,构建出更加健壮和可维护的应用程序。
相关文章:
深入理解Spring的ApplicationContext:案例详解与应用
深入理解Spring的ApplicationContext:案例详解与应用 在Spring框架的丰富生态中,ApplicationContext扮演着至关重要的角色。作为BeanFactory的扩展,ApplicationContext不仅继承了其所有功能,还引入了更多高级特性,使得…...
6.Java并发编程—深入剖析Java Executors:探索创建线程的5种神奇方式
Executors快速创建线程池的方法 Java通过Executors 工厂提供了5种创建线程池的方法,具体方法如下 方法名描述newSingleThreadExecutor()创建一个单线程的线程池,该线程池中只有一个工作线程。所有任务按照提交的顺序依次执行,保证任务的顺序性…...
英语阅读挑战
英语阅读真是令人头痛的东西。可怜的子航想利用寒假时间突破英语难题。当他拿到一篇英语阅读时,他很好奇作者最喜欢用那些字母。 输入 一句30词以内的英语句子 输出 统计每个字母出现的次数 样例输入 复制 However,the British dont have a history of exporting th…...
备战蓝桥之思维
平台重叠真的坑 给你一句样例,如果你觉得自己的代码没问题那就试试吧 2 1 1 3 1 0 4 正确答案 0 0 0 0 P1105 平台 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) import java.awt.Checkbox; import java.awt.PageAttributes.OriginType; import java.io.B…...
09 string的实现
注意 实现仿cplus官网的的string类,对部分主要功能实现 实现 头文件 #pragma once #include <iostream> #include <assert.h> #include <string>namespace mystring {class string{friend std::ostream& operator<<(std::ostream&a…...
Git 进行版本控制时,配置 user.name 和 user.email
在使用 Git 进行版本控制时,配置 user.name 和 user.email 是一个非常重要的初始步骤,但不是绝对必须的。这两个配置项定义了当你进行提交(commit)时用于标识提交者的信息。 为什么建议配置 user.name 和 user.email 标识提交者…...
传统开发读写优化与HBase
目录: 一、传统开发数据读写性能优化 1. Mysql 分表、主从复制与读写分离 2. Redis(缓存型数据库)主从复制与读写分离 二、HBase 一、传统开发数据读写性能优化 1、Mysql 分表、主从复制与读写分离 mysql分库分表方案 一种分表方案:设置表A 表B 表A 自增列从1开始…...
【OpenGL实现 03】纹理贴图原理和实现
目录 一、说明二、纹理贴图原理2.1 纹理融合原理2.2 UV坐标原理 三、生成纹理对象3.1 需要在VAO上绑定纹理坐标3.2 纹理传递3.3 纹理buffer生成 四、代码实现:五、着色器4.1 片段4.2 顶点 五、后记 一、说明 本篇叙述在画出图元的时候,如何贴图纹理图片…...
FDU 2021 | 二叉树关键节点的个数
文章目录 1. 题目描述2. 我的尝试 1. 题目描述 给定一颗二叉树,树的每个节点的值为一个正整数。如果从根节点到节点 N 的路径上不存在比节点 N 的值大的节点,那么节点 N 被认为是树上的关键节点。求树上所有的关键节点的个数。请写出程序,并…...
精读《React Conf 2019 - Day2》
1 引言 这是继 精读《React Conf 2019 - Day1》 之后的第二篇,补充了 React Conf 2019 第二天的内容。 2 概述 & 精读 第二天的内容更为精彩,笔者会重点介绍比较干货的部分。 Fast refresh Fast refresh 是更好的 react-hot-loader 替代方案&am…...
向ChatGPT高效提问模板
PS: ChatGPT无限次数,无需魔法,登录即可使用,网页打开下面 tj4.mnsfdx.net [点击跳转链接](http://tj4.mnsfdx.net/) 我想请你XXXX,请问我应该如何向你提问才能得到最满意的答案,请提供全面、详细的建议,针对每一个建…...
android metaRTC编译
参考文章: metaRTC3.0稳定版本编译指南_metartc 编译-CSDN博客 源码下载: Releases metartc/metaRTC GitHub 版本v6.0-b4即可...
HDFS面试重点
文章目录 1. HDFS的架构2. HDFS的读写流程3.HDFS中,文件为什么以block块的方式存储? 1. HDFS的架构 HDFS的架构可以分为以下几个主要组件: NameNode(名称节点): NameNode是HDFS的关键组件之一,…...
Java中的IO流是什么?
Java中的IO流(Input/Output Stream)是Java编程语言中用于处理输入和输出操作的一种重要机制。在Java中,IO流被用来读取和写入数据,这些数据可以来自各种来源,如文件、网络连接、内存缓冲区等。Java的IO流提供了丰富的类…...
Spring boot 集成netty实现websocket通信
一、netty介绍 Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和U…...
数码管的动态显示(二)
1.原理 这个十六进制是右边的dp为高位。 数码管的动态显示,在第一个计数周期显示个位,在第二个周期显示十位,在第三个周期显示百位由于人眼的视觉和数码管的特性,感觉就是显示了234,每个数码管的显示需要从输入的数据里…...
【JavaScript】数据类型转换 ① ( 隐式转换 和 显式转换 | 常用的 数据类型转换 | 转为 字符串类型 方法 )
文章目录 一、 JavaScript 数据类型转换1、数据类型转换2、隐式转换 和 显式转换3、常用的 数据类型转换4、转为 字符串类型 方法 一、 JavaScript 数据类型转换 1、数据类型转换 在 网页端 使用 HTML 表单 和 浏览器输入框 prompt 函数 , 接收的数据 是 字符串类型 变量 , 该…...
git学习(创建项目提交代码)
操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …...
Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入
目录 Java-项目管理-工具配置 Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用…...
HTML5+CSS3+JS小实例:全屏范围滑块
实例:全屏范围滑块 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…...
企业级数据采集架构实战:破解动态字体加密的高性能爬虫系统
企业级数据采集架构实战:破解动态字体加密的高性能爬虫系统 【免费下载链接】dianping_spider 大众点评爬虫(全站可爬,解决动态字体加密,非OCR)。持续更新 项目地址: https://gitcode.com/gh_mirrors/di/dianping_sp…...
TCL脚本中info命令与文件路径操作的实战解析
1. TCL脚本中info命令的核心作用 在TCL脚本开发中,info命令就像是一个万能工具箱,它能让你随时查看解释器的内部状态。这个命令特别适合需要动态获取脚本信息的场景,比如你想知道当前执行的脚本路径、检查某个变量是否存在,或者查…...
精通Android标签布局开发:使用FlycoTabLayout构建高效导航体验
精通Android标签布局开发:使用FlycoTabLayout构建高效导航体验 【免费下载链接】FlycoTabLayout An Android TabLayout Lib 项目地址: https://gitcode.com/gh_mirrors/fl/FlycoTabLayout 在Android应用开发中,标签页导航是提升用户体验的关键元素…...
让经典游戏重获新生:d3d8to9如何终结Direct3D 8兼容性难题
让经典游戏重获新生:d3d8to9如何终结Direct3D 8兼容性难题 【免费下载链接】d3d8to9 A D3D8 pseudo-driver which converts API calls and bytecode shaders to equivalent D3D9 ones. 项目地址: https://gitcode.com/gh_mirrors/d3/d3d8to9 你是否还记得那些…...
AI辅助开发:利用快马智能生成技能学习路径推荐算法
AI辅助开发:利用快马智能生成技能学习路径推荐算法 最近在做一个技能学习平台的项目,需要实现一个智能推荐系统。作为独立开发者,面对复杂的推荐算法和数据处理逻辑有点无从下手。这时候发现了InsCode(快马)平台的AI辅助开发功能,…...
告别重复造轮子:用快马AI一键生成开yun高效开发脚手架
最近在做一个开yun相关的项目,发现每次从零开始搭建项目框架特别费时间。各种依赖配置、部署脚本、服务注册,光是这些基础工作就要折腾好几天。后来发现了InsCode(快马)平台,用它来生成标准化的项目脚手架,效率提升了好几倍。 统一…...
无需电脑也能装IPA?揭秘iOS应用部署新方案
无需电脑也能装IPA?揭秘iOS应用部署新方案 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer 你是否遇到过这样的尴尬:出差在外想安装一个重要的IPA文件,却发现身边…...
医疗、金融、反欺诈...实战解析知识图谱如何给大模型“治病”(减少幻觉提升可解释性)
知识图谱如何成为大语言模型的“特效药”:医疗、金融与反欺诈实战解析 当ChatGPT误将"阿司匹林"推荐给血友病患者时,当信贷审批系统无法解释拒贷原因时,当反洗钱模型将正常跨境交易标记为可疑时——这些正是当前大语言模型&#x…...
Wespeaker:构建工业级说话人识别系统的完整解决方案
Wespeaker:构建工业级说话人识别系统的完整解决方案 【免费下载链接】wespeaker Research and Production Oriented Speaker Verification, Recognition and Diarization Toolkit 项目地址: https://gitcode.com/gh_mirrors/we/wespeaker 在现代智能语音系统…...
告别重复造轮子:用快马ai一键生成stm32的spi驱动与ws2812b控制代码
告别重复造轮子:用快马AI一键生成STM32的SPI驱动与WS2812B控制代码 最近在做一个基于STM32F407的项目,需要用到SPI通信和WS2812B灯带控制。作为一个嵌入式开发者,每次都要从头开始写这些外设驱动的代码,实在是有点浪费时间。好在…...
