news 2026/1/12 12:15:06

【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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/22 17:18:27

这样去论文AI痕迹,语言自然、逻辑严密、毫无机器味

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

作者头像 李华
网站建设 2025/12/22 17:17:48

网盘直链下载助手:六大平台真实下载地址一键获取终极指南

在当今数字时代&#xff0c;网盘已成为我们日常工作和生活中不可或缺的工具。然而&#xff0c;面对下载速度受限、必须安装官方客户端、无法使用专业下载工具等痛点&#xff0c;你是否渴望一种更高效的解决方案&#xff1f;网盘直链下载助手正是为此而生&#xff0c;这款免费开…

作者头像 李华
网站建设 2025/12/22 17:17:14

3分钟极速解锁:网易云音乐NCM格式转换终极指南

还在为网易云音乐的NCM加密格式而烦恼吗&#xff1f;ncmdump作为一款专业的NCM格式转换工具&#xff0c;能够快速将加密的NCM文件转换为标准FLAC或MP3格式&#xff0c;完美实现音乐格式转换和网易云音乐解密需求。无论你是音乐爱好者还是普通用户&#xff0c;只需简单几步即可享…

作者头像 李华
网站建设 2025/12/22 17:14:54

Open-AutoGLM电脑版究竟有多强?:实测5大核心场景下的效率提升奇迹

第一章&#xff1a;Open-AutoGLM电脑版究竟有多强&#xff1f;——颠覆效率认知的智能引擎Open-AutoGLM电脑版作为新一代智能自动化引擎&#xff0c;正重新定义人机协作的边界。它融合了大语言模型的理解能力与本地化执行环境的高效响应&#xff0c;能够在无需人工干预的前提下…

作者头像 李华
网站建设 2025/12/22 17:14:45

BetterGI:重新定义你的原神游戏体验,开启智能自动化新时代

BetterGI&#xff1a;重新定义你的原神游戏体验&#xff0c;开启智能自动化新时代 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Te…

作者头像 李华
网站建设 2025/12/22 17:14:23

为什么90%的人首次部署Open-AutoGLM都会失败?真相就在这7个细节里

第一章&#xff1a;Open-AutoGLM本地部署失败的根源剖析在尝试将 Open-AutoGLM 项目部署至本地环境时&#xff0c;开发者常遭遇启动失败、依赖缺失或配置错误等问题。这些问题往往源于环境适配性不足与核心组件初始化异常。环境依赖不匹配 Open-AutoGLM 对 Python 版本及第三方…

作者头像 李华