2007 年开始接触 spring, spring mvc + jsp 一直是最喜爱的 web 开发方式。 spring 版本从 2.x 发展到今天的 4.x, 对新特性的了解和使用却非常少。 回过头来看, 几年间 spring 其实也发生了许多革命性的变化。 再看现在的 spring 官网, 已然变成一个包含众多子项目的庞大组织。

从我的角度看, 主要有以下几个方面的变革:

  1. 引入 @RequestMapping 注解
  2. 更大粒度的组件
  3. 自动补齐组件
  4. 使用 java 配置

这些变革都在大大提升 spring 的易用性和灵活性。最主要的, 还是简化配置和自动配置。

更大粒度的组件主要依靠 Configurer 完成, 由于 spring 提倡细粒度模块化, 过去要完成一件事, 我们动辄要配置十几个 bean, 现在 spring 将常用场景的典型用法抽象成一组代码框架, 我们只要引入一个 Configurer 就可以将这套框架的一堆 bean 配置起来, 而不必逐个配置, 如 WebMvcConfigurationSupport。 自动补齐组件则是 spring boot autoconfig 提供的功能, spring 自动检测你要做什么事, 然后缺失的 bean 自动使用典型配置给你补上。 虽然 spring 留了许多口子给用户实施自定义配置的机会, 实际上却损失了许多灵活性。

  1. 首先, 针对我们需要做出的修改, 要找到 spring 预留的正确的修改入口和修改方式得花费不少时间。 通常我不断阅读和琢磨代码及文档才明白怎么做, 有时比从头写传统配置还费时间。 这应该是一个技术栈的问题, 随着对新框架的了解, 应该会越来越快。

  2. 使用这些简易配置的用户, 常常不关心一些底层细节, 导致做自定义需求或排查问题变得困难。

  3. 受框架限制一些基本配置很难定义。 如 spring boot 1.3.x 不支持修改 dispatcherServlet 的 loadOnStartup 属性, 我碰到这个问题, 然后 google 到 github 上也有人提了这个 issue: https://github.com/spring-projects/spring-boot/issues/2481 。 类似问题解决办法: (1) fork 官方代码, 自己打一个版本解决此问题。麻烦且不通用。 (2) 不使用配置框架, 自己配置组建所需的 bean (传统模式)。丢失了自动配置特性, 配置比较麻烦, 而且要考虑与其他组件的整合。 (3) 像官方反馈问题, 其他官方解决此问题, 等待新版本。非通用问题官方可能不会理会。比较麻烦, 等待周期太长。