Spring Boot 解析系列:初识

Spring Boot 特性

  • Create stand-alone Spring applications

  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

  • Provide opinionated ‘starter’ dependencies to simplify your build configuration

  • Automatically configure Spring and 3rd party libraries whenever possible

  • Provide production-ready features such as metrics, health checks and externalized configuration

  • Absolutely no code generation and no requirement for XML configuration

以上是官网提供的特性介绍:

  • 创建独立的 spring 应用

  • 直接嵌入 Tomcat、jetty、undertow 容器(无需部署war文件)

  • 提供固化的“starter”依赖,简化构建配置

  • 提供自动化装配spring 或第三方类库的可能

  • 提供运维特性,如指标信息、健康检查、及外部优化配置等。

  • 绝无代码生成,并且不需要XML配置。

这样看还是有些抽象,什么是spring 应用?什么是固化依赖?下面对各个特性做逐一解释。

独立的 spring 应用

什么叫独立的 spring 应用呢?为什么以其作为 Spring Boot 的第一特性?

传统模式下,为了构建 spring 应用,需要通过在外置容器中通过配置,在外置容器启动以后加载 spring 上下文。例如构建 spring web 应用时,需要在 web.xml 文件中配置以下信息,使得 serverlet 在执行生命周期内创建 DispatcherServlet 的spring 应用上下文,完成上下文加载。这种属于被调用执行,而spring 自身不能主导整个过程。

Spring Boot 出现以后,自身内嵌容器,而容器成为应用的一部分。 Spring Boot 掌握主导权,将这些内嵌容器作为 Spring 的一部分。 应用启动时,利用自动转配机制,将容器 bean 和其他组件 bean 加载到 Spring 的上下文中。 驱动 Spring 应用上下文启动的核心组件是 SpringAppliation API,  因此称为 Spring 应用,也为Spring Boot 应用。

内嵌容器

Spring Boot 相比于传统的开发模式一个最为方便的就是内嵌容器,这样部署启动时 只要通过 java -jar 方式就可以启动。 因此就不用搭建一套 Tomcat 环境进行开发测试、线上部署,直接run就可以。

Spring Boot 支持多种容器,如 Tomcat、Jetty、Undertow,默认是内嵌 Tomcat。 而且也支持方便替换,只要指定容器的 maven 依赖,就可以切换Spring Boot 的嵌入式容器,无需修改代码。

 固化依赖配置

Spring Boot 提供了 spring-boot-dependencies 和 spring-boot-start-parant。 这两个模块已经将 Spring Boot 应用所需要的大部分依赖都管理起来。 为了方便引入这些模块都是采用 xxx-starter 的方式出现,目前开源的 SOFA 也是采用这套模式。

比如可以通过引入 spring-boot-starter-web 后,就可以使用 spring-web 相关功能,而无需关心该功能所需的依赖包,这些spring boot 已经帮你管理。 spring boot 除了管理依赖模块外,还把相关的版本都管理起来,使用  spring-boot-dependencies  后,引入各个模块则无需指定版本。  这些特性属于maven 依赖管理的范畴,降低了spring boot 依赖管理的成功。

以往开发最头疼的就是遇到包冲突的问题,各个包之间必须兼容才能正常工作,spring boot 帮你简化了这些工作。 但 spring-boot-starter-parant 采用了单继承的方式,所以限定了模块的继承模式。 这也就是 “opinionated” 的语义,即固化了maven 依赖,把 Spring Boot 相关依赖版本给固化了。

 自动装配

Spring Boot 提供了自动化将spring 及第三方类库的bean, 而无需开发人员在xml 文件中指定或java代码指定。 只需要添加 @EnableAutoConfiguration 或@SpringBootApplication 在标注有 @Configuration 类上,Spring Boot 就会负责帮忙将相关的类进行自动化装配。

回顾传统模式,使用 spring-mvc 能力时需要显著的配置spring-mvc 相关bean, 以便于spring 能够加载。

提供运维特性

Spring Boot 提供了 metric(指标)、health checks(健康检查)和 externalized configuration (外部配置)等生产特性,使得 Spring Boot 应用具备 production-ready features。  

如果把一个系统看做一个人,人生病了需要看病吃药,系统也是。 有医生帮忙判断人是否健康,而系统如何检查呢? Spring Boot 提供了health checks 和 metric 等机制,可以看到系统在线上的实时情况。 如果系统出现异常则可及时处理,避免系统故障。

注解驱动

Spring Boot 提供了一套注解驱动编程,可以简化配置,告别古老的xml 配置。注解驱动很早就有,例如 spring 框架提供的 @Autowired @Service 等 Annotation。 从开发编程界面上说,注解方式比 xml 更加友好。

注解带来的好处有:

  1. XML配置起来有时候冗长,此时注解可能是更好的选择。 比如一个bean 的生命只要加 @Component  即可

  2. 注解最大的好处就是简化了XML配置,提高开发效率。

  3. 不需要第三方的解析工具,利用java反射技术就可以完成任务。

  4. XML 编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。

  5. IDE 无法验证配置项的正确性无能为力。

参考资料

[1]  Spring Boot 官网

[2] 《Spring Boot 编程思想》