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

上一篇文章中我把Spring模块中的核心模块进行了介绍,这篇文章会以此为基础将剩下的模块介绍一下

1. Data

这个模块主要是用于简化数据库的访问,比较重点以及常用的就是JDBC、ORM、事务管理这三块。

1.1 JDBC

这个我想大家应该会经常用到,类似于下面的代码

csharp 复制代码
@Autowired
private JdbcTemplate jdbcTemplate;

public List<User> getAllUsers() {
    return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));
}

JDBC提供了一些操作数据库的方法,可以简化开发效率,另外这里其实应用到了模版方法设计模式,这个我打算后面专门写一篇来总结一下,各类源码中设计到的设计模式来看看优秀的框架中怎么去运用各种设计模式的。

1.2 ORM

所谓的ORM框架,如Hibernate、JPA、MyBatis,简化持久层的开发。ORM实际上是封装了JDBC,提供了对象映射和自动SQL生成。在具体的选用上,ORM在大多数场景下实际都是可行的,JDBC更适合复杂的SQL和高性能需求。

1.3 Transactions

这个模块主要的作用就是支持声明式事物,@Transactional,避免我们去手写事物代码,另外支持事物控制等。这里也有很多重要的地方,我们后面要单独写一篇文章来介绍事物的相关内容。

2. Web

Web部分也是Spring比较核心的模块了,整个模块整体可分为两部分Servlet、Reactive

2.1 Servlet

Servlet是基于 Servlet API 的传统 Web 开发模型(同步阻塞式),其中Spring-web是支持基础的HTTP通信而Spring-webmvc是MVC的重要实现(DispatcherServlet、控制器、视图解析等) 这里比较重要的就是DispatcherServlet,它属于前端控制器,负责分发处理请求。另外还有视图解析、@Controller都是这一模块的具体体现,在对具体的注解驱动上:

  • @RequestMapping@GetMapping@PostMapping:定义请求映射。
  • @RequestParam@PathVariable@RequestBody:参数绑定。
  • @ResponseBody:直接返回数据(如 JSON)。

2.2 Reactive

相比较传统的MVC模式,Reactive是基于 Reactive Streams 的响应式 Web 开发模型(异步非阻塞式),其中 spring-webflux 响应式 Web 框架(WebHandler、函数式端点、WebClient)是重要实现 那其实WebHandler就是替代Servlet里的DispatcherServlet来进行响应式请求处理。

其实我们在这就可以看出来,Reactive模式更适用于高并发、流式处理。这一块我目前其实没有接触过,实习的公司目前用的还都是传统的MVC模式。

但在微服务模块中,这是必不可少的技能,用于处理高并发的路由请求。

3. AOP/Aspects

AOP也是Spring框架里比较重要的一个模块,其基本实现是基于动态代理,而Aspects实现方式是通过编译期/类加载期织入,后者功能更强大,应用范围也更广一些,而前者更轻量级。

另外AOP主要的作用是解决非业务代码对业务代码对入侵,听起来很抽象,我们举个例子来说,我们通常在Service实现层进行编码时,基本上每个方法都会去添加一些打日志的代码,那这就属于非业务核心代码,我们想要降低代码的冗余性就可以采用AOP去将日志代码抽取出来作为一个切面。

另外我们在上文中说到的@Transactional的实现原理其实也是使用AOP拦截@Transactional注解的方法,在方法执行前后管理事务的提交与回滚。而Aspects对于更复杂的需求(拦截字段),这种更适合它。

后面会重点去剖析AOP的源码,AOP就先说到这。

4. Instrumentation

核心目标:通过 Java Instrumentation API(java.lang.instrument)在类加载时修改字节码,实现 无侵入式的代码增强。 最典型的应用便是上面刚说的AspectJ 加载时织入。 其中的核心组件是: InstrumentationSavingAgent:将 Java Agent 挂载到 JVM,允许在类加载时拦截并修改字节码。

LoadTimeWeaver:接口抽象,用于集成 AspectJ 的加载时织入(需配置 @EnableLoadTimeWeaving)。

ClassFileTransformer:自定义类转换器,实现字节码修改逻辑。

另外还有两块,就是MessagingTest模块,这里就不赘述了!

5. 总结

花了2篇文章来把这个模块写清楚,其实这只是刚入门而已,重点模块里的源码设计思想才是我们需要去学习的!下篇文章见!

相关推荐
我命由我123453 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
咖啡八杯4 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
AIGS0015 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
KaMeidebaby5 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
醉城夜风~7 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
数智化转型推荐官8 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互8 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
程序员张310 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端
闲猫10 小时前
Spring AI Agentic 模式(第1部分):Agent Skills——模块化、可复用的能力
java·人工智能·spring
源图客10 小时前
云途物流API开发-鉴权认证(Java)
java·网络·python