当前位置: 首页 > news >正文

【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!

http://www.cnnetsun.cn/news/184106.html

相关文章:

  • springboot人口老龄化社区活动老年人服务和管理平台 _xl261auu
  • springboot四川自驾游攻略管理系统_3ra412wd
  • 网易云音乐NCM解密工具:三步解锁你的专属音乐库
  • 网盘直链下载助手终极指南:免客户端高速下载全攻略
  • 网易云音乐NCM文件终极解密:从加密到无损转换全攻略
  • Poppler Windows工具集:PDF处理效率的革命性突破
  • 5分钟彻底解锁网易云音乐NCM格式:从加密到无损的完美转换
  • iOS微信自动抢红包插件技术解析与使用指南
  • DLSS版本管理神器:DLSS Swapper完全使用指南
  • 六音音源修复版完整教程:轻松解决洛雪音乐播放问题
  • 如何快速修复洛雪音乐六音音源失效问题
  • 去论文AI痕迹别乱改!这4类句子最容易暴露,一定要重点润色
  • 知网降AI率保姆级教程:亲测有效,稳过检测!(2025最新版)
  • Vue-Office完全指南:5分钟实现Web端Office文件在线预览
  • GitHub汉化插件终极指南:5分钟让GitHub说中文
  • ncmdump终极指南:3步解锁网易云音乐NCM格式限制
  • Ollydbg下载及安装实战案例:快速搭建用户层调试器
  • 制造业数字化服务商如何助力企业转型?
  • Iwara视频下载工具完全指南:从零开始掌握高效下载技巧
  • NCM音频格式转换终极指南:轻松解锁网易云音乐加密文件
  • Anything-LLM:3分钟打造属于你的智能文档聊天机器人
  • BetterGI完整使用指南:从零开始掌握原神自动化
  • 基于Gin+Vue的前后端分离权限管理系统设计与实现
  • 参数碾压GPT-4o!HINDSIGHT重构AI Agent记忆架构,准确率提升38%!
  • DLSS Swapper终极教程:三分钟学会游戏性能优化
  • NCMconverter音频转换工具:解锁网易云音乐格式限制的实用方案
  • 哔哩下载姬完整指南:三步搞定8K视频无水印下载
  • QtScrcpy终极指南:跨平台Android投屏控制完全手册
  • GitHub中文插件:一键告别英文界面烦恼!
  • Vue-Office快速上手:3步搞定Web端Office文档预览