上一篇文章中我把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:自定义类转换器,实现字节码修改逻辑。
另外还有两块,就是Messaging 和Test模块,这里就不赘述了!
5. 总结
花了2篇文章来把这个模块写清楚,其实这只是刚入门而已,重点模块里的源码设计思想才是我们需要去学习的!下篇文章见!