Spring Boot (一)
概述
Spring Framework已有十余年的历史了,已成为Java应用程序开发框架的事实标准。在如此悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什么新鲜的东西了,或者是让人激动的东西。甚至有人说,Spring是遗留项目,是时候去看看其他创新的东西了。但事实上,Spring的生态圈里正在出现很多让人激动的新鲜事物,涉及的领域涵盖云计算、大数据、无模式的数据持久化、响应式编程以及客户端应用程序开发。在过去的几年里,最让人兴奋的大概就是Spring Boot了。
Spring Boot是什么?
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。从字面意思来理解,Boot是引导的意思,因此Spring Boot用来帮助开发者快速搭建Spring框架,它就是Spring的封装,简而言之,从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的SpringBean配置,有了Spring Boot,你就不用再写这些样板配置了,可以专注于应用程序的逻辑,这些才是应用程序独一无二的东西。
重新认识Spring
假设你受命用Spring开发一个简单的Hello World Web应用程序。你应该完成以下的工作:
- 一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖
- 一个web.xml文件(或者一个WebApplicationInitialization实现),其中声明了Sping的DispatcherServlet。
- 一个启动了Spring MVC的Spring配置。
- 一个控制器类,以"Hello World"响应HTTP请求。
- 一个用于部署应用程序的Web应用服务器,比如Tomcat。
最让人难受的是,这份清单里只有一个东西是和Hello World功能相关的,即控制器(Controller),剩下的都是Spring开发的Web应用程序必须的通用样板。既然所有的Spring Web应用程序都要用到它们,那为什么还要你来提供这些东西呢?于是Spring Boot诞生了。
Spring Boot 精要
Spring Boot将很多魔法带入到了Spring应用程序的开发之中,其中最重要的是以下四个核心。
- 自动配置:针对很多Spring应用程序的常见的应用功能,Spring Boot能自动提供相关配置。
- 起步依赖:告诉Spring Boot需要什么功能,他就能引入需要的库。
- 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统的项目构建。
- Actuator:让你能够深入观察正在运行中的Spring Boot应用程序。
1.自动配置:总所周知,Spring有几个特点分别是Ioc(控制反转)、DI(依赖注入)、AOP(面向切面),有了这些你才能构建一个完整的Spring应用程序,但是整个搭建框架的过程其实是大同小异的,根据业务需求添加相应的依赖,配置数据源,整合不同的框架等等,特别是繁琐的Java配置或XML配置。比如:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
这些都是样板配置根本不需要手动配置。Spring Boot会为这些常见的场景进行自动配置。如果Spring Boot在Classpath里发现了H2数据库的库,那么它将自动配置一个H2数据库。如果在Classpath里发现了一个JdbcTemplate,那么他将自动配置JdbcTemplate的Bean。当然,Spring Boot的自动配置远不止这些,它将涵盖到Java持久化API(Java Persistence API,JPA)、Thymeleaf模板、安全和Spring MVC等。
2.起步依赖:在往项目中添加依赖的时候,总是会遇到很多问题,比如:在解决这个问题的时候你需要使用哪些库?这些库的Group和Artifact是什么?需要什么版本?不同的依赖之间会不会有冲突?等等。Spring Boot通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的Maven依赖和Gradle依赖,利用了传递依赖解析,将常见的库聚合在一起,组成了几个为特定功能而定制的依赖。
打个比方,如果你正在用Spring MVC构造一个REST API,并将JSON作为资源表述。此外,你还想遵循JSR-303规范的声明式校验,并使用嵌入式的Tomcat服务器提供服务。你至少要引入以下依赖:
- org.springframework:spring-core
- org.springframework:spring-web
- org.springframework:spring-webmvc
- org.fasterxml.jackson.core:jackson-databind
- org.hibernate:hibernate-validator
- org.apache.tomcat.embed:tomcat-embed-core
- org.apache.tomcat.embed:tomcat-embed-el
- org.apache.tomcat.embed:tomcat-embed-logging-juli
但是,如果你使用Spring Boot的起步依赖,你就只需要添加Spring Boot的Web起步依赖
- org.springframework.boot:spring-boot-starter-web
仅此一个一个依赖就可以完成以上全部工作,你甚至不用去考虑版本冲突,最令人惊喜的是,该应用程序是Web,所以添加了Web的启动依赖,与之相同的是,如果应用程序还用到JPA持久化,那么就可以直接添加JPA起步依赖,如果需要安全功能,那么就直接添加security起步依赖。总之,你不在需要考虑实现某种功能需要引入哪些库了,也不需要考虑版本问题,它们之间不会出现不兼容的情况。
3.命令行界面:Spring Boot CLI提供了只写代码即可实现应用程序的开发。
4.Actuator:在运行Spring Boot的应用程序时,因为自动配置和起步依赖,大大的简化了开发过程,那么就会有人想,由于前期的配置过程全部交给了Spring Boot,而程序员本身并不能很好的了解其内部究竟是如何运行,于是Actuator很好解决了这个问题。安装了Actuator就能窥探应用程序的内部情况,包括以下细节:
- Spring应用程序上下文里配置的Bean
- Spring Boot的自动配置做的决策
- 应用程序的环境变量、系统属性、配置属性和命令行参数
- 应用程序里线程的当前状态
- 应用程序最近处理过的HTTP请求的追踪情况
- 各种和内存用量、垃圾回收、web请求以及数据源用量相关的指标
Actuator通过Web端点和Shell界面为外界提供信息。
以上内容大部分引用自Spring Boot 实战。