news 2026/5/8 19:16:32

【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/5/5 9:45:05

springbootQ高中学生综合素质评价档案系统_52x8708v

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果…

作者头像 李华
网站建设 2026/5/1 9:51:20

springbootVehicle 校园车辆校车管理系统可视化大屏数据分析系统_316264e9

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果…

作者头像 李华
网站建设 2026/5/4 11:28:08

从AI味浓到学术范儿:我的去论文AI痕迹全流程实操分享

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

作者头像 李华
网站建设 2026/5/1 5:02:58

去论文AI痕迹用哪个工具好?2025最新测评,降AI嘎嘎快!

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

作者头像 李华
网站建设 2026/5/5 5:21:51

anything-llm:构建企业级AI应用的模块化解决方案

anything-llm&#xff1a;构建企业级AI应用的模块化解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;LLM&…

作者头像 李华
网站建设 2026/5/4 13:05:48

开题报告写哭?这款 AI 神器 15 分钟搞定,导师直夸 “逻辑封神”!

“选题被否 3 次&#xff0c;开题报告改到崩溃”“文献综述东拼西凑&#xff0c;逻辑混乱没重点”“技术路线图画不明白&#xff0c;研究方法写不规范”…… 对于本科生、研究生来说&#xff0c;开题报告是学术之路的第一道 “拦路虎”。传统写作模式耗时费力&#xff0c;普通 …

作者头像 李华