news 2026/6/23 23:03:11

【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/23 18:11:10

springboot人口老龄化社区活动老年人服务和管理平台 _xl261auu

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

作者头像 李华
网站建设 2026/6/23 13:47:28

springboot四川自驾游攻略管理系统_3ra412wd

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

作者头像 李华
网站建设 2026/6/23 17:52:58

网易云音乐NCM解密工具:三步解锁你的专属音乐库

网易云音乐NCM解密工具&#xff1a;三步解锁你的专属音乐库 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 还在为网易云音乐的NCM格式限制而烦恼吗&#xff1f;这款轻量级NCM解密工具让你轻松突破格式…

作者头像 李华
网站建设 2026/6/23 17:52:26

网盘直链下载助手终极指南:免客户端高速下载全攻略

在当今数字化时代&#xff0c;网盘下载已成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;传统网盘下载方式往往受限于官方客户端&#xff0c;下载速度慢、操作繁琐的问题一直困扰着用户。网盘直链下载助手作为一款免费开源的浏览器扩展脚本&#xff0c;完美解决了…

作者头像 李华
网站建设 2026/6/23 4:41:41

网易云音乐NCM文件终极解密:从加密到无损转换全攻略

网易云音乐NCM文件终极解密&#xff1a;从加密到无损转换全攻略 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 你是否曾经下载了网易云音乐的歌单&#xff0c;却发现文件都是NCM格式&#xff0c;无法在…

作者头像 李华
网站建设 2026/6/23 13:58:59

Poppler Windows工具集:PDF处理效率的革命性突破

Poppler Windows工具集&#xff1a;PDF处理效率的革命性突破 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为PDF文档处理效率低下而烦恼吗&a…

作者头像 李华