现在 Spring 越来越大,都开始使用 Gradle 构建了,支持的东西越来越多,这就导致大多数程序员对 Spring 的体系及结构都一知半解,网上乱七八糟的文章来回粘来粘去,搞得小码农都分不清楚到底哪种使用方式是对的,这归根到底就是因为

1. 对 Spring 的版本变更不清楚
2. 对 Spring 和 J2EE 规范的关系不清楚
3. 对 Spring 那堆配置和注解背后的原理不清楚

你可能知道 DI 是个什么概念,但你可能不知道 DI 的正确使用方式:
1. 你也许不知道 Spring 有自己的测试体系,我们可以直接使用
2. Spring 的事务管理优越在哪里,和 Hibernate 自己的事务管理有啥区别,怎么配置才对。
3. Spring 为啥提倡非侵入式(non-invasive)设计,又是从哪个版本开始这么干的,起因是什么
4. Spring 那些注解的使用原理和适用场景是什么,哪些是Spring 自己的注解,哪些是 J2EE DI 的标准注解,使用哪个好,为什么好。
...........

上述的一切,当你把 Spring 官方提供的 Spring Reference 看的差不多了,也就明白了,大概 500 多页吧。

Spring 越来越大,衍生出其他的分支项目,虽然臃肿,但如果你知道如何筛选自己想要的功能,就不会臃肿,反而会很简洁,例如:
1. 你想实现 Rest 服务,那么 Spring MVC 就预置了这个功能,你没必要再去使用 CXF / Restlet 之类的 Rest 框架,还得忙着想怎么和 Spring 整合,这样,Struts 就出局了,Rest 框架也省了。
2. 你想实现权限功能,那么 Spring Security 可以替你搞定,你没必要使用 Apache Shiro 来做,也没必要苦逼地自己设计,而且人家还原生支持 OAuth 和 SAML
3. 你不想苦逼地写 DAO, 那么 Spring Data 可以替你做,这些 boilerplate code 全部替你实现了,而且对 JPA 或 NO-SQL 的支持也是相当方便。
4. 你无法忍受也无法记住 spring 的配置方式和配置逻辑,你只想专心写自己的业务代码而不愿关心工具到底如何配置,那么 SpringBoot 可以搞定一切。
...........

其他的,还有很多很多,你只需要记住,是不是臃肿,很大程度上是由你的认知和使用能力决定的,不是框架本身,具体如何学习这个优秀的框架,建议:
1. 视频教程点到为止,不可全信,网上流传的课程,本身就有错误存在
2. 各种帖子看看就好,别拷过来自己完事
3. 有问题,先去查阅 Spring Reference,懂原理才能游刃有余