Spring Boot实战 浅析

最近一段时间 粗读了一遍 《Spring Boot 实战》,对简单的Spring Boot 开发做一些总结。

Spring Boot 简介

Spring诞生时是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级替代品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入等技术,用简单的Java对象实现了EJB功能。

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多的配置,Spring2.5入了基于注解的组件扫描,消除了大量针对应用程序自身组件的显示XML配置。Spring3.0引入了基于Java的配置,可以替代XML配置。尽管如此,开启某些Spring特性时,比如事务管理和Spring MVC,还是需要用XML和Java进行显示配置。所有这些配置都代表了开发时的损耗。

除此之外,项目的依赖管理也是件吃力不讨好的事情。你不知道这些库的哪个版本与其他库会不会有冲突,并且,依赖管理也是一种损耗,添加依赖不是写应用程代码一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问是生产力杀手。Spring Boot让这一切成为了过去。

Spring Boot的优点

1、Spring Boot并不是要成为Spring平台里面众多项目的替代者。其目标不在于为已解决的问题提供新的解决方案,而是为平台带来另一种开发体验,从而简化对这些已有技术的使用。

2、Spring Boot使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。

3、Spring Boot是基于Spring4进行设计,继承了原有Spring框架的优秀基因。

Spring Boot四大主题

1、起步依赖:它将常用的依赖分组进行了整理,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;

2、自动配置:Spring Boot的自动配置特性利用了Spring4对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;

3、命令行接口(Command-line interface,CLI):这是Spring Boot的可选特性,它发挥了Groovy编程语言的优势,并结合自动配置进一步简化了Spring应用的开发;

4、Actuator:它为Spring Boot应用添加了一定的管理特性。

起步依赖特性:

向项目中添加依赖是件富有挑战的事。你需要什么库?它的Group和Artifact是什么?你需要哪个版本?这些版本之间的依赖会不会有冲突?Spring Boot通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的Maven或Gradle依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖。

举个例子,假设你正在用Spring MVC构造一个REST API,并将JSON作为服务资源,此外,你还想运用遵循JSR-303规范的声明式校验,并使用嵌入式的Tomcat服务器来提供服务。要实现以上目标,你在Maven或Gradle里至少需要以下8个依赖:

org.springframework:spring-core
org.springframework:spring-web
org.springframework:spring-webmvc
com.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应用程序,所以加入了Web起步依赖。与之类似,如果应用程序要用到JPA持久化,那么就可以加入jpa起步依赖。如果需要安全功能,那就加入security起步依赖。简而言之,你不再需要考虑支持某种功能要用什么库了,引入相关起步依赖就行。

此外,Spring Boot的起步依赖还把你从“需要这些库的哪些版本”这个问题里解放了出来。起步依赖引入的库的版本都是经过测试的,因此你可以完全放心,它们之间不会出现不兼容的情况。

自动配置特性:

在任何Spring应用程序的源代码里,你都会找到Java配置或XML配置,它们为应用程序开启了特定的特性和功能。举个例子,通过JDBC访问数据库,那么需要在Spring应用程序上下文里配置JdbcTemplate这个Bean,就像下面这样:

@Bean
Public JdbcTemplate jdbcTemplate(DataSource dataSource) {
	return new JdbcTemplate(dataSource);
}

这段非常简单的Bean声明创建了一个JdbcTemplate的实例,注入了一个DataSource依赖。这意味着还需要配置一个DataSource的Bean,这样才能满足依赖。像上面这样,还有无数Spring应用程序有着完全相同的方法。所有需要用到数据库和JdbcTemplate的应用程序都会用到那些方法,简而言之,这就是一个样板配置。

Spring Boot会为这些常见配置场景进行自动配置。如果Spring Boot在应用程序的Classpath里发现了MySQL数据库的库,那么它就会自动配置一个MySQL数据库。如果在Classpath里发现JdbcTemplate,那么它还会为你配置一个JdbcTemplate的Bean。你无需操心那些Bean的配置,Spring Boot会做好准备,随时都能将其注入到你的Bean里。

命令行接口特性:

假设用Spring开发一个简单的Hello World Web应用程序,大致会用到下面一些基本的需要。
1 一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构件文件,最起码要有Spring MVC和Servlet API这些依赖。
2 一个web.xml文件,其中声明了Spring的DispatcherServlet。
3 一个启用了Spring MVC的Spring配置。
4 一个控制器类,以”Hello World“响应HTTP请求。
5 一个用于部署应用程序的Web应用服务器,比如Tomcat。
最让人难以接受的是,这份清单里只有一个东西是和Hello World功能相关的 ,即控制器,剩下的都是Spring开发Web应用程序必须的通用模板。既然所有的Spring Web应用程序都要用到它们,那为什么还要我们来提供这些东西呢?
假设这里只需要控制器。下面基于Groovy的控制器类就是一个简单而完整的Spring应用程序。

@RestController
class HelloController {
	@RequestMapping("/")
	def hello() {
		return "Hello World"
	}
}

上面的代码没有配置,没有web.xml,没有构建说明,甚至没有应用服务器,但这就是整个应用程序了。Spring Boot会搞定执行应用程序所需的各种后勤工作,我们只要搞定应用程序的代码就好。
假设我们已经装好了Spring Boot的命令行接口(Command Line Interface,CLI),可以像下面这样在命令行里运行HelloController:

$ spring run HelloController.groovy

Spring Boot并不强制要求使用Groovy,还可以使用Java代码编写,只是Groovy语言更简洁。
Spring Boot CLI利用了起步依赖和自动配置,让我们专注于代码本身,CLI能检测到我们使用了哪些类,它知道要向Classpath中添加哪些起步依赖才能让它运转起来。
一旦那些依赖出现在Classpath中,一系列自动配置就会接踵而来,确保启用DispatcherServlet和Spring MVC,这样控制器就能响应HTTP请求了。
Spring Boot CLI是Spring Boot的非必要组成部分。虽然它为Spring带来了惊人的力量,大大简化了开发,但也引入了一套不太常规的开发模型。那也没关系,抛开CLI,我们还是可以利用Spring Boot提供的其他东西.

Actuator特性

前面几个部分都是在简化Spring开发,而Actuator则要提供在运行时监视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况了,包括如下细节:
1 Spring应用程序上下文里配置的Bean
2 Spring Boot自动配置做的决策
3 应用程序取到的环境变量、系统属性、配置属性和命令行参数
4 应用程序里线程的当前状态
5 应用程序最近处理过的HTTP请求的追踪情况
6 各种和内存容量、垃圾回收、Web请求以及数据源相关的指标

覆盖Spring Boot自动配置

大多数情况下,自动配置的Bean刚好能满足我们的需要,不需要去覆盖它们。但某些情况下,Spring Boot在自动配置时还不能很好地进行推断。

假设我们在应用程序里添加安全特性时,自动配置做得还不够好。安全配置并不是通用的,围绕应用程序安全还有很多决策要做,Spring Boot不能替你做决定。虽然Spring Boot为安全提供了一些基本的自动配置,但是我们还是需要自己覆盖一些配置以满足特定的安全要求。

覆盖自动配置很简单,就当自动配置不存在,直接显示地写一段配置。这段显示配置的形式不限,Spring支持的XML和Groovy形式配置都可以。

通过属性文件外置配置

Spring Boot自动配置的Bean提供了300多个用于微调的属性。当我们调整设置时,只要在环境变量、Java系统属性,JNDI、命令行参数或者属性文件里进行指定就好了。

假设Spring Boot应用程序里有一个ascii-art Banner。如果我们想禁用这个Banner,可以将spring.main.show-banner属性设置为false。有几种实现方式,其中之一就是在运行应用程序的命令行参数里指定:

$ java –jar xxx.jar --spring.main.show-banner=false

另一种方式是创建一个名为application.properties的文件,包含如下内容:

spring.main.show-banner=false

或者创建名为application.yml的YAML文件,内容如下:

spring:
  main:
      show-banner: false

Spring Boot 总结

Spring Boot是Spring家族中一个令人振奋的新项目。Spring致力于简化Java开发。而Spring Boot致力于让Spring本身更加简单。
Spring Boot用了两个技巧来消除Spring项目中的样板式配置:起步依赖和自动配置。
一个简单的起步依赖能够替换到Maven和Gradle构建中许多通用的依赖。
自动配置充分利用了Spring4.0的条件化配置特性,能够自动配置特定的Spring Bean,用来启用某项特性。
Spring Boot的CLI使用Groovy进一步简化了Spring项目。
最后,Spring Boot Actuator为基于Spring Boot开发的Web应用提供了一些通用的管理特性。

猜你喜欢

转载自blog.csdn.net/Dullon_jiang/article/details/88875129