Spring Boot 解析系列:初识

Spring boot 系列,主要通过解读 Spring Boot 源码分析其内部实现机制。  本文为该系列第一篇,主要介绍 Spring Boot 及其特性。

春天来了,带着大家一起看Spring Boot.  愿春来疫走,山河无漾,人皆幸福。

为什么要写这个系列?

说来惭愧,从毕业到现在虽然使用过Spring Boot 开发,但了解很浅显。在蚂蚁工作的时间都是使用内部框架 SOFA,其底层也是基于Spring Boot 技术。随着组织结构调整,从中间件服务组调整到框架组,也越来越多同事来咨询框架的问题。随着问题增多,发现自身在这块知识储备的不足,因此有必要系统化学习,理解底层的设计思想。

其二,也是为了督促自己学习。写文章可以让自己思考的更多,会对一些知识去求证。避免自己不理解,还要告诉别人这个东西是什么样子。

其三,主要感谢卫总送的一般Spring Boot 书。为了不辜负他的好意,得需要好好学习,天天向上。

Spring Boot 简介

回顾本科开发网站时,一般采用 SSH (struts2 + spring + hibernate) 框架开发。开发完成后需要编译生成一个 war 包 然后部署到 tomcat 环境。需要了解tomcat的搭建,部署等等。

进入职场以后,在师兄那边接触到使用代码内嵌的方式将tomcat嵌入到应用中。 部署的时候就不用去部署tomcat, 不用打war包。 后面发现Spring Boot 已经提供了内嵌容器的功能,不用自己编写内嵌代码,极大方便了开发。

Spring Boot 的让开发人员关注业务开发过程,极大简化了配置、部署等。 正如官网介绍,Spring Boot 能够让你简单地创建一个独立的、生产级别的应用。 你只要运行即可,无需关系容器本身。 同时也以“starter”模式管理了一些外部依赖包,可以快速引入,避免包冲突等问题。

Spring Boot makes it easy to create stand-alone , production-grade Spring based Applications that you can "just run".

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.

从官网的说明上,我关注到几个词: easy、stand-alone(独立)、production-grade(生产级别)、opioniated view(固化的视图)。这些在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 编程思想》

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章