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篇文章来把这个模块写清楚,其实这只是刚入门而已,重点模块里的源码设计思想才是我们需要去学习的!下篇文章见!

相关推荐
少许极端18 小时前
算法奇妙屋(七)-字符串操作
java·开发语言·数据结构·算法·字符串操作
懒羊羊不懒@18 小时前
Java基础语法—字面量、变量详解、存储数据原理
java·开发语言
望获linux18 小时前
【实时Linux实战系列】实时 Linux 的自动化基准测试框架
java·大数据·linux·运维·网络·elasticsearch·搜索引擎
Code blocks18 小时前
GB28181视频服务wvp部署(一)
java·spring boot·后端
我命由我1234518 小时前
Spring Boot - Spring Boot 静态资源延迟响应(使用拦截器、使用过滤器、使用 ResourceResolver)
java·spring boot·后端·spring·java-ee·intellij-idea·intellij idea
Xzh042319 小时前
前后端学习的交界
java·ajax·maven·axios·测试
豆沙沙包?19 小时前
2025年--Lc201- 378. 有序矩阵中第 K 小的元素(排序)--Java版
java·线性代数·矩阵
华仔啊19 小时前
3 分钟让你彻底搞懂 Spring 观察者和发布者模式的本质区别
java·后端
没有bug.的程序员19 小时前
服务治理与 API 网关:微服务流量管理的艺术
java·分布式·微服务·架构·wpf
宠友信息19 小时前
java微服务驱动的社区平台:友猫社区的功能模块与实现逻辑
java·开发语言·微服务