news 2026/6/10 18:54:49

【Spring】ApplicationContext 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring】ApplicationContext 详解

ApplicationContext 详解

ApplicationContext 是 Spring 框架的核心接口,它是 BeanFactory 的子接口,提供了更丰富的功能。下面从作用、使用方法、注意事项等方面详细介绍。

一、核心作用

ApplicationContext 主要负责:

  • IoC 容器:管理 Bean 的生命周期和依赖注入
  • 资源访问:统一访问 classpath、文件系统、URL 等资源
  • 事件发布:支持应用事件机制(观察者模式)
  • 国际化:支持 i18n 消息解析
  • 注解驱动:支持注解配置(@Component, @Service 等)
  • AOP 集成:与面向切面编程无缝集成

二、常见实现类

实现类适用场景配置方式
ClassPathXmlApplicationContext独立应用,classpath 下的 XML 配置XML
FileSystemXmlApplicationContext独立应用,文件系统路径的 XMLXML
AnnotationConfigApplicationContext纯注解配置的独立应用Java Config
GenericApplicationContext通用实现,可自定义后处理器多种
GenericGroovyApplicationContextGroovy 脚本配置Groovy
GenericWebApplicationContextWeb 应用(非 Spring Boot)多种

三、使用方法

1. XML 配置方式

// 加载 classpath 下的 XML 配置ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");// 加载文件系统路径的 XMLApplicationContextcontext=newFileSystemXmlApplicationContext("D:/config/applicationContext.xml");// 获取 BeanUserServiceuserService=context.getBean("userService",UserService.class);

2. Java 注解配置方式

// 配置类@Configuration@ComponentScan(basePackages="com.example")@PropertySource("classpath:app.properties")publicclassAppConfig{@BeanpublicDataSourcedataSource(){// 配置数据源returnnewDriverManagerDataSource();}}// 启动容器ApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig.class);UserServiceuserService=context.getBean(UserService.class);

3. Spring Boot 方式

@SpringBootApplicationpublicclassMyApplication{publicstaticvoidmain(String[]args){// 自动创建 ApplicationContextConfigurableApplicationContextcontext=SpringApplication.run(MyApplication.class,args);// 获取 BeanMyServiceservice=context.getBean(MyService.class);}}

4. Web 应用配置

web.xml 方式(传统):

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

Servlet 3.0+ 注解方式:

publicclassMyWebAppInitializerimplementsWebApplicationInitializer{@OverridepublicvoidonStartup(ServletContextcontainer){AnnotationConfigWebApplicationContextcontext=newAnnotationConfigWebApplicationContext();context.register(AppConfig.class);container.addListener(newContextLoaderListener(context));}}

四、核心特性

1. 资源访问

// 获取 classpath 资源Resourceresource=context.getResource("classpath:config.properties");// 获取 URL 资源ResourceurlResource=context.getResource("https://example.com/data.json");// 获取文件系统资源ResourcefileResource=context.getResource("file:/opt/app/config.xml");

2. 国际化

// 获取消息Stringmessage=context.getMessage("user.welcome",newObject[]{"张三"},Locale.CHINA);// 需要在配置中定义 MessageSource Bean@BeanpublicMessageSourcemessageSource(){ResourceBundleMessageSourcesource=newResourceBundleMessageSource();source.setBasename("messages");returnsource;}

3. 事件发布

// 定义事件publicclassUserRegisterEventextendsApplicationEvent{publicUserRegisterEvent(Objectsource){super(source);}}// 发布事件context.publishEvent(newUserRegisterEvent(user));// 监听事件@ComponentpublicclassUserRegisterListenerimplementsApplicationListener<UserRegisterEvent>{@OverridepublicvoidonApplicationEvent(UserRegisterEventevent){// 处理注册逻辑}}

五、注意事项

1.容器重复创建问题

// 错误:多次创建容器publicclassSomeClass{publicvoidmethod1(){newClassPathXmlApplicationContext("beans.xml");// 浪费资源}publicvoidmethod2(){newClassPathXmlApplicationContext("beans.xml");// 又创建一个}}// 正确:单例模式持有容器publicclassApplicationContextHolder{privatestaticfinalApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");publicstaticApplicationContextgetContext(){returncontext;}}

2.Web 应用中的容器管理

  • Servlet 容器Spring 容器是两个不同的概念
  • Web 应用中通常使用ContextLoaderListener创建根容器
  • DispatcherServlet 可以创建自己的子容器(可选)
  • 避免手动创建 ApplicationContext,应该由框架管理

3.配置文件位置

// 推荐:使用 ClassPathXmlApplicationContext// 配置文件放在 src/main/resources 下newClassPathXmlApplicationContext("classpath:applicationContext.xml");// 避免硬编码绝对路径// new FileSystemXmlApplicationContext("D:/project/config/beans.xml");

4.Bean 的作用域

// 注意 Bean 的默认作用域是 singleton// 对于 Web 应用,可以使用 request/session 作用域@Scope("prototype")// 多例@Scope("request")// Web 请求级别@Scope("session")// Web 会话级别

5.内存泄漏风险

// 在 Web 应用中,确保容器正确关闭// Spring Boot 会自动处理// 独立应用需要注册关闭钩子((ConfigurableApplicationContext)context).registerShutdownHook();

6.配置拆分策略

// 大型项目建议拆分配置ApplicationContextcontext=newClassPathXmlApplicationContext("classpath:spring-dao.xml","classpath:spring-service.xml","classpath:spring-mvc.xml");// 或使用 import 标签// <import resource="spring-dao.xml"/>

7.测试时的注意事项

// 单元测试中使用 @ContextConfiguration@RunWith(SpringRunner.class)@ContextConfiguration(classes=AppConfig.class)publicclassMyServiceTest{@AutowiredprivateMyServicemyService;// 测试方法}

8.性能优化

  • 延迟初始化:设置lazy-init="true"加速启动
  • 扫描优化@ComponentScan指定精确包路径,避免扫描整个 classpath
  • 配置缓存:频繁访问的配置可以缓存,避免重复读取

9.版本兼容性

  • Spring 5.x 需要 Java 8+
  • Spring Boot 2.x 使用 Spring 5.x
  • Spring Boot 3.x 需要 Java 17+ 和 Spring 6.x

10.资源释放

// 使用 try-with-resources 确保关闭try(ConfigurableApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml")){// 使用容器MyServiceservice=context.getBean(MyService.class);service.doSomething();}// 自动关闭

六、最佳实践

  1. 优先使用注解配置:现代 Spring 项目推荐使用 Java Config
  2. 使用 Spring Boot:对于新项目,直接使用 Spring Boot 简化配置
  3. 避免手动获取 Bean:尽可能使用依赖注入(@Autowired)
  4. 合理拆分配置:按功能模块拆分配置文件或配置类
  5. 注意 Bean 的线程安全:Singleton Bean 必须是线程安全的
  6. 谨慎使用@PostConstruct:初始化逻辑不要过于复杂

希望这些内容能帮助你全面理解 ApplicationContext!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 17:18:07

基于SpringBoot的网页即时聊天系统

即时通讯技术的发展背景随着互联网技术的飞速发展&#xff0c;即时通讯&#xff08;Instant Messaging, IM&#xff09;已成为现代社交和商业活动中不可或缺的工具。从早期的QQ、MSN到如今的微信、Slack、Telegram等&#xff0c;即时通讯技术经历了从桌面端到移动端、从单一文本…

作者头像 李华
网站建设 2026/6/10 19:16:34

论文被标“高度疑似AI生成”?这样去AI痕迹,3小时通过ai查重

2025年起&#xff0c;高校已明确要求毕业论文要检测AIGC率&#xff0c;AI率高于30%或40%就不能参加答辩&#xff0c;而部分学校、硕士论文更加严格&#xff0c;要求在20%以内。 这其中&#xff0c;大多数高校使用的AIGC检测系统是知网、万方、维普等主流查重系统&#xff0c;这…

作者头像 李华
网站建设 2026/6/10 5:36:42

Switch手柄电脑连接终极指南:从零到精通

还在为Switch手柄连接电脑而烦恼吗&#xff1f;本指南将带你从基础连接到高级配置&#xff0c;让你轻松享受大屏游戏体验。BetterJoy这款神器能完美转换Switch手柄为电脑通用控制器&#xff0c;支持Pro手柄、Joy-Con和SNES手柄&#xff0c;兼容CEMU、Citra、Dolphin、Yuzu等主流…

作者头像 李华
网站建设 2026/6/9 23:42:19

洛雪音乐六音音源完整修复教程:快速恢复音乐播放功能

洛雪音乐六音音源完整修复教程&#xff1a;快速恢复音乐播放功能 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐升级后六音音源失效而困扰吗&#xff1f;本教程将为你提供完整的六…

作者头像 李华
网站建设 2026/6/10 11:51:18

BetterJoy终极使用指南:简单快速让Switch手柄在PC上完美运行

BetterJoy终极使用指南&#xff1a;简单快速让Switch手柄在PC上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/6/9 18:06:44

基于乘积项的一位全加器实现:实战示例

从真值表到门电路&#xff1a;一位全加器的SOP设计实战你有没有想过&#xff0c;CPU里最基础的加法操作&#xff0c;究竟是怎么实现的&#xff1f;别看A B只是两个数相加&#xff0c;背后其实是一堆逻辑门在默默工作。而这一切的起点&#xff0c;往往就是一个简单却关键的电路…

作者头像 李华