Java架构师成长之路-框架源码系列-整体认识Spring体系结构(1)

emmm...第一次写博客,觉得应该说些什么,但技术之路,无须多言,直接🐛就好了!

首先,我相信有很多人和我一样,在刚接触Spring的时候会一脸懵逼,也不明白各个结构模块之间到底是什么关系,谁包含谁,以及各模块之间的联系是什么?hold on ,hold on!我们的悲喜是相通的,所以希望用我自己的学习经验带大家梳理一下Spring的体系结构,小白发言,如果有什么不对的地方,欢迎大家指正学习!

首先,大家要知道的是,Spring是按照模块化进行设计的,具体的模块如下图所示,我也以此图为准来为大家介绍各模块,在这里我不细致的介绍源码,后面的文章会细致介绍主要部分。

1. Core Container(核心模块)

我们首先从Spring的核心说起,因为这是其他模块建立的基础:

1.1 Beans

这个模块是最核心的模块,它提供了BeanFactory 的实现,豆子工厂嘛,这也是工厂模式的一个体现,并且负责Bean的定义、依赖注入和生命周期管理,里面有三个重要的接口:

  • BeanFactory:最基础的IoC容器接口,负责Bean的创建和管理;
  • ApplicationContext:这是现在去用的容器接口,是BeanFactory的子接口但也是增强版,提供了更强大的功能;
  • BeanPostProcessor:允许在Bean初始化前后自定义逻辑处理;

1.2 Core

这个模块提供了核心工具类、类型转换、资源访问、反射封装等一些核心功能

  • 资源访问(Resource):Spring 提供 org.springframework.core.io.Resource 及相关实现类,统一管理不同类型的资源访问(如文件、类路径、URL 等)。里面提供好多实现类就是用于管理不同的资源
  • Resource(接口):Spring 资源访问的抽象,支持文件、URL、类路径资源等。 ClassPathResource:从 classpath: 读取资源。
ini 复制代码
- Resource resource = new ClassPathResource("config.properties");
- InputStream inputStream = resource.getInputStream();
  • 类型转换:Spring 提供 ConversionService 进行 数据类型转换,这里其实主要适用于在用@Value注入的时候进行数据类型转换。
  • 反射工具:Spring提供ReflectionUtils 来简化反射操作,封装了字段访问、方法调用、类遍历功能。具体在应用时的场景就是在SpringAOP、Bean注入的时候会用到,减少手写反射的麻烦。
  • 线程池管理:这里重点的线程池实现类都是此模块来提供。

还有一些就不详细介绍了,大家可以自行去查看。

1.3 Context

其实这个模块这里我们只需要知道它是BeanFactory的增强版ApplicationContext 的完整实现就行,提供了完整的Spring运行时环境。作为一个更强大的容器,它增强了AOP以及SpringBoot的自动装配(本质上是用ApplicationContextAware 访问 ApplicationContext)以及注解驱动(相比于XML方式注解方式更加简洁),所以它是整个Spring框架的核心(实际上是建立在Beans模块和Core模块之上的)。

1.4 SpEL

SpEL 是 Spring 生态中的表达式语言 ,用于在运行时动态解析和计算表达式,支持从对象图、配置、方法调用中提取或操作数据。 实际上,在简单场景上很少会碰到SpEL的具体使用,它的价值更多的体现在特定的灵活性和动态性上。

kotlin 复制代码
// 动态读取配置 + 计算(如超时时间 = 基础值 * 倍数)
@Value("#{${base.timeout} * ${timeout.multiplier}}")
private long timeout;
// 调用 Bean 方法获取配置(如根据环境变量动态计算)
@Value("#{configManager.getApiEndpoint()}")
private String apiUrl;

2. 小总结

这篇文章主要是把Spring模块里最核心的部分简单介绍一下,后面其他的模块基本也是基于这些来进行扩展的, 第一次写博客就先写到这里,下一篇尽量把体系结构写完!有些东西我也是在慢慢学,慢慢写,所以欢迎大家指正讨论! 另外,希望大家能够共同努力,沉下心来去把自身技术沉淀下来!共勉!

相关推荐
努力的小郑17 分钟前
MySQL索引(三):字符串索引优化之前缀索引
后端·mysql·性能优化
IT_陈寒39 分钟前
🔥3分钟掌握JavaScript性能优化:从V8引擎原理到5个实战提速技巧
前端·人工智能·后端
程序员清风1 小时前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
考虑考虑1 小时前
Java实现字节转bcd编码
java·后端·java ee
AAA修煤气灶刘哥2 小时前
ES 聚合爽到飞起!从分桶到 Java 实操,再也不用翻烂文档
后端·elasticsearch·面试
爱读源码的大都督2 小时前
Java已死?别慌,看我如何用Java手写一个Qwen Code Agent,拯救Java
java·人工智能·后端
星辰大海的精灵2 小时前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
天天摸鱼的java工程师3 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
一乐小哥3 小时前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
LSTM973 小时前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端