我写这篇文章的对象是:正在学习 Spring Framework 的 Java 开发者,尤其是对 Spring 容器的运行机制感到困惑的同学。在工作中,我曾经因为没有搞清楚容器的加载顺序和依赖关系,导致 Bean 初始化失败。后来把核心模块理清楚后,问题迎刃而解。所以本文会结合我的经验,把 spring-core、spring-beans、spring-context 的作用和联系说明清楚,帮助初学者避免类似的坑。


1. spring-core:容器的底层支持

  • 提供 IoC 容器的基本接口,如 BeanFactory
  • 包含 资源加载机制(Resource 抽象),方便统一访问文件、URL 等资源;
  • 内置工具类(反射、类型转换)。

代码示例(最小容器用法):

Resource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
UserService userService = factory.getBean("userService", UserService.class);

这里 BeanFactory 就是最轻量级的 Spring 容器实现。


2. spring-beans:Bean 的定义与依赖注入

spring-core 基础上,spring-beans 模块提供:

  • BeanDefinition:存储 Bean 的类名、作用域、依赖关系;
  • 属性注入与依赖管理
  • Bean 生命周期管理(初始化、销毁回调)。

实际场景:在一个用户管理系统里,如果 UserService 依赖 UserRepository,容器会在创建 Service 时自动完成依赖装配。


3. spring-context:增强型容器

  • ApplicationContext:比 BeanFactory 更强大,支持事件机制和注解驱动;
  • 国际化(i18n)支持
  • 事件监听,如 ApplicationListener
  • 注解扫描@ComponentScan@Autowired)。

示例:

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
OrderService orderService = ctx.getBean(OrderService.class);

BeanFactory 不同,ApplicationContext 会在容器启动时预加载所有单例 Bean,更适合企业级应用。


4. Spring 容器的运行机制

容器的启动流程一般分为五步:

  1. 读取配置(XML、注解或 Java Config);
  2. 解析 Bean 定义(转换为 BeanDefinition);
  3. 实例化与依赖注入
  4. 调用生命周期回调init-method@PostConstruct);
  5. 容器关闭时销毁 Bean

示意图(可画成图,下面先用文字表示):

配置文件/注解 -> BeanDefinition -> IoC 容器 -> Bean 实例化 -> 依赖注入 -> 生命周期管理

5. 我的经验

在我的项目里,我发现:

  • 如果只是写一个工具程序,用 spring-core + spring-beans 就够了;
  • 如果是企业应用,一定要用 spring-context,因为注解和事件机制能大大减少配置量;
  • 开发时,最好对 Bean 的作用域和生命周期有清晰认识,否则可能遇到懒加载或多例 Bean 导致的资源问题。

我的代码里有个小习惯:每个自定义 Bean 都会加上注释 // author: LLL,方便团队里区分是谁写的代码。


总结

本文介绍了 Spring 容器 的三大核心模块:

  • spring-core:基础设施,提供 BeanFactory;
  • spring-beans:Bean 的定义与依赖注入;
  • spring-context:增强功能,提供 ApplicationContext、事件、注解驱动。

希望这篇文章能帮助刚入门的同学快速理解 Spring 容器的分层和运行机制,避免在实际开发中因为容器不清晰而踩坑。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐