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