Spring Boot
从2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE (Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java EE 使用Spring 逐渐变得笨重起来,大量的XML 文件存在于项目之中。繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低。2012 年10 月,Mike Youngstrom 在Spring jira 中创建了一个功能请求,要求在Spring 框架中支持无容器Web 应用程序体系结构。他谈到了在主容器引导spring 容器内配置Web 容器服务。这是jira 请求的摘录:
我认为Spring 的Web 应用体系结构可以大大简化,如果它提供了从上到下利用Spring 组件和配置模型的工具和参考体系结构。在简单的main() 方法引导的Spring 容器内嵌入和统一这些常用Web 容器服务的配置。
这一要求促使了2013 年初开始的Spring Boot 项目的研发,到今天,Spring Boot 的版本已经到了2.0.3 RELEASE 。Spring Boot 并不是用来替代Spring 的解决方案,而是和Spring 框架紧密结合用于提升Spring 开发者体验的工具。它集成了大量常用的第三方库配置,Spring Boot 应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box) ,大部分的Spring Boot 应用都只需要非常少量的配置代码(基于Java 的配置) ,开发者能够更加专注于业务逻辑。
Spring Boot 定位
Spring 的官方网站,可以看到下图:
我们可以看到图中官方对Spring Boot 的定位:Build Anything, Build 任何东西。Spring Boot 旨在尽可能快地启动和运行,并且只需最少的Spring 前期配置。同时我们也来看一下官方对后面两个的定位:
SpringCloud:Coordinate Anything,协调任何事情;
SpringCloud Data Flow:Connect everything,连接任何东西。
Spring Boot 与SSM
SSM 是Spring IoC 、Spring MVC、Mybatis 的组合。SSM 限定死了你只能开发Java Web 应用,而且MVC 框架必须用Spring MVC ,持久层必须用Mybatis 。Spring Boot 没有和任何MVC 框架绑定,没有和任何持久层框架绑定,没有和任何其他业务领域的框架绑定。开发Web 应用可以用Spring Boot 。用spring-boot-starter-web 就帮你配置好了Spring MVC 。你不想用Spring MVC 了,换成Spring WebFLux( 用spring-boot-starter-webflux) 写响应式Web 应用。数据持久层,你可以用Spring Data 项目下的任何子项目(JPA\JDBC\MongoDB\Redis\LDAP\Cassandra\Couchbase\Noe4J\Hadoop\Elasticsearch ….),当然用非Spring 官方支持的Mybatis 也可以。只要用上对应技术或框架的spring-boot-starter-xxx 就可以了。
但是必须要知道,Spring Boot 提供的只是这些starters ,这些Starter 依赖了(maven dependence) 对应的框架或技术,但不包含对应的技术或框架本身!
Spring Boot 优点
良好的基因
Spring Boot 是伴随着Spring 4.0 诞生的,从字面理解,Boot 是引导的意思,因此Spring Boot 旨在帮助开发者快速搭建Spring 框架。Spring Boot 继承了原有Spring 框架的优秀基因,使Spring 在使用中更加方便快捷。
简化编码
举个例子,比如我们要创建一个web 项目,使用Spring 的朋友都知道,在使用Spring 的时候,需要在pom 文件中添加多个依赖,而Spring Boot 则会帮助开发着快速启动一个web 容器,在Spring Boot 中,我们只需要在pom 文件中添加如下一个starter-web 依赖即可。
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-web</artifactId >
</dependency >
我们点击进入该依赖后可以看到,Spring Boot 这个starter-web 已经包含了多个依赖,包括之前在Spring 工程中需要导入的依赖,我们看一下其中的一部分,如下:
<dependency >
<groupId > org.springframework</groupId >
<artifactId > spring-web</artifactId >
<version > 5.0.7.RELEASE</version >
<scope > compile</scope >
</dependency >
<dependency >
<groupId > org.springframework</groupId >
<artifactId > spring-webmvc</artifactId >
<version > 5.0.7.RELEASE</version >
<scope > compile</scope >
</dependency >
简化配置
Spring 虽然号称Java EE 轻量级框架,但由于其繁琐的配置,一度被人认为是“配置地狱”。各种XML 、Annotation 配置会让人眼花缭乱,而且配置多的话,如果出错了也很难找出原因。Spring Boot 更多的是采用Java Config 的方式,对Spring 进行配置。举个例子,我新建一个类,但是我不用@Service 注解,也就是说,它是个普通的类,那么我们如何使它也成为一个Bean 让Spring 去管理呢?只需要@Configuration 和@Bean 两个注解即可,如下:
public class TestService {
public String sayHello () {
return "Hello Spring Boot!" ;
}
}
@Configuration
public class JavaConfig {
@Bean
public TestService getTestService () {
return new TestService ();
}
}
@Configuration 表示该类是个配置类,@Bean 表示该方法返回一个Bean 。这样就把TestService 作为Bean 让Spring 去管理了,在其他地方,我们如果需要使用该Bean ,和原来一样,直接使用@Resource 注解注入进来即可使用,非常方便。
@Resource
private TestService testService ;
另外,部署配置方面,原来Spring 有多个xml 和properties 配置,在Spring Boot 中只需要个application.yml 即可。
简化部署
在使用Spring 时,项目部署时需要我们在服务器上部署tomcat ,然后把项目打成war 包扔到tomcat 里,在使用Spring Boot 后,我们不需要在服务器上去部署tomcat ,因为Spring Boot 内嵌了tomcat ,我们只需要将项目打成jar 包,使用java -jar xxx.jar 一键式启动项目。
另外,也降低对运行环境的基本要求,环境变量中有JDK 即可。
简化监控
我们可以引入spring-boot-start-actuator 依赖,直接使用REST 方式来获取进程的运行期性能参数,从而达到监控的目的,比较方便。但是Spring Boot 只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要Spring Cloud 来配合一起使用。