Spring Boot 2.X 来临,本文将带你起飞!
Java技术栈
www.javastack.cn
优秀的Java技术公众号
当前互联网技术盛行,以Spring 框架为主导的Java 互联网技术成了主流,而基于Spring 技术衍生出来的Spring Boot,采用了“约定优于配置”的思想,极大地简化了Spring 框架的开发。
随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的热点技术。2017 年9 月,Spring 框架出现了重大版本升级,从4.x 版本升级为了5.x 版本,随着这次升级,Spring Boot的版本也在2018年3月从1.x升级到了2.x。
文末送出 10 本最新 Spring Boot 2.X 的书!
Spring Boot的优点
谈到Spring Boot,就让我们先来了解它的优点。依据官方的文档,Spring Boot的优点如下:
创建独立的Spring应用程序;
嵌入的Tomcat、Jetty或者Undertow,无须部署WAR文件;
允许通过Maven来根据需要获取starter;
尽可能地自动配置Spring;
提供生产就绪型功能,如指标、健康检查和外部配置;
绝对没有代码生成,对XML没有要求配置。
这段描述告诉我们,首先Spring Boot是一个基于Spring框架搭建起来的应用,其次它会嵌入Tomcat、Jetty或者Undertow等服务器,并且不需要传统的WAR文件进行部署,也就是说搭建Spring Boot项目并不需要单独下载Tomcat等传统的服务器。
同时提供通过Maven(或者Grandle)依赖的starter,这些starter可以直接获取开发所需的相关包,通过这些starter项目就能以Java Application的形式运行Spring Boot的项目,而无须其他服务器配置。
对于配置,Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽量减少。
此外还提供了一些监测、自动检测的功能和外部配置,与此同时没有附加代码和XML的配置要求。
约定优于配置,这是Spring Boot的主导思想。对于Spring Boot而言,大部分情况下存在默认配置,你甚至可以在没有任何定义的情况下使用Spring框架,如果需要自定义也只需要在配置文件配置一些属性便可以,十分便捷。
而对于部署这些项目必需的功能,Spring Boot提供starter的依赖,例如,spring-boot-starter-web捆绑了Spring MVC所依赖的包,spring-boot-starter-tomcat绑定了内嵌的Tomcat,这样使得开发者能够尽可能快地搭建开发环境,快速进行开发和部署,这就是Spring Boot的特色。也许作为传统开发者的你,还未能理解其意义,但这并不要紧。
为了展示Spring Boot的特色,下节将分别展示传统Spring MVC项目和简易的Spring Boot入门实例,并进行比较。
传统Spring MVC和Spring Boot的对比
在传统的Spring MVC项目开发中,开发一个简易的Spring MVC项目,需要配置DispatcherServlet,也需要配置Spring IoC的容器。你可以选择使用web.xml的配置来实现,当然,如果你使用的是Servlet 3.1规范,也可以继承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer来配置Spring MVC项目。
这里先给出可以运行的代码示例,即使你还不熟悉Spring MVC也没有关系,这里只是为了说明开发比较烦琐而已,后面将详谈Spring MVC的开发原理。
假设你已经导入需要的Spring和Spring MVC相关的依赖包到工程中,那么就可以开始配置DispatcherServlet了。例如,代码清单1-1就是通过继承AbstractAnnotationConfigDispatcherServletInitializer的方式来配置Spring MVC的DispatcherServlet的。
代码清单1-1 配置Spring MVC
1package com.springboot.springmvc.conf;
2
3import
4org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
5public class MyWebAppInitializer
6 extends AbstractAnnotationConfigDispatcherServletInitializer {
7
8 // Spring IoC容器配置
9
10 protected Class<?>[] getRootConfigClasses() {
11 // 可以返回Spring的Java配置文件数组
12 return new Class<?>[] {};
13 }
14
15 // DispatcherServlet的URI映射关系配置
16
17 protected Class<?>[] getServletConfigClasses() {
18 // 可以返回Spring的Java配置文件数组
19 return new Class<?>[] { WebConfig.class };
20 }
21
22 // DispatcherServlet拦截请求匹配
23
24 protected String[] getServletMappings() {
25 return new String[] { "*.do" };
26 }
27}
注意代码中加粗的地方。这里引入了一个Java配置文件—— WebConfig.java,它的主要作用是配置Spring MVC的核心类DispatcherServlet的上下文,如代码清单1-2所示。
代码清单1-2 配置DispatcherServlet的上下文
1package com.springboot.springmvc.conf;
2
3import java.util.ArrayList;
4import java.util.List;
5import org.springframework.context.annotation.Bean;
6import org.springframework.context.annotation.ComponentScan;
7import org.springframework.context.annotation.ComponentScan.Filter;
8import org.springframework.context.annotation.Configuration;
9import org.springframework.context.annotation.FilterType;
10import org.springframework.http.MediaType;
11import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
12import org.springframework.stereotype.Controller;
13import org.springframework.web.servlet.HandlerAdapter;
14import org.springframework.web.servlet.ViewResolver;
15import org.springframework.web.servlet.config.annotation.EnableWebMvc;
16import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
17import org.springframework.web.servlet.view.InternalResourceViewResolver;
18
19
20// 定义Spring MVC扫描的包
21 })
24// 启动Spring MVC配置
25
26public class WebConfig {
27
28 /***
29 * 通过注解@Bean初始化视图解析器
30 *
31 * @return ViewResolver视图解析器
32 */
33
34 public ViewResolver initViewResolver() {
35 InternalResourceViewResolver viewResolver
36 = new InternalResourceViewResolver();
37 viewResolver.setPrefix("/WEB-INF/jsp/");
38 viewResolver.setSuffix(".jsp");
39 return viewResolver;
40 }
41
42 /**
43 * 初始化RequestMappingHandlerAdapter,并加载HTTP的JSON转换器
44 *
45 * @return RequestMappingHandlerAdapter 对象
46 */
47
48 public HandlerAdapter initRequestMappingHandlerAdapter() {
49 // 创建RequestMappingHandlerAdapter适配器
50 RequestMappingHandlerAdapter rmhd = new RequestMappingHandlerAdapter();
51 // HTTP JSON转换器
52 MappingJackson2HttpMessageConverter jsonConverter
53 = new MappingJackson2HttpMessageConverter();
54 // MappingJackson2HttpMessageConverter接收JSON类型消息的转换
55 mediaType = MediaType.APPLICATION_JSON_UTF8;
56 List<MediaType> mediaTypes = new ArrayList<MediaType>();
57 mediaTypes.add(mediaType);
58 // 加入转换器的支持类型
59 jsonConverter.setSupportedMediaTypes(mediaTypes);
60 // 给适配器加入JSON转换器
61 rmhd.getMessageConverters().add(jsonConverter);
62 return rmhd;
63 }
64}
通过上面的代码,配置完成Spring MVC的开发环境后,才可以开发Spring MVC控制器Controller,这样就可以开发一个简单的控制器(Controller),如代码清单1-3所示。
代码清单1-3 开发Spring MVC控制器
1package com.springboot.springmvc.controller;
2
3import java.util.HashMap;
4import java.util.Map;
5import org.springframework.stereotype.Controller;
6import org.springframework.web.bind.annotation.RequestMapping;
7import org.springframework.web.bind.annotation.ResponseBody;
8
9
10public class TestController {
11
12 ("/test")
13
14 public Map<String, String> test() {
15 Map<String, String> map = new HashMap<String, String>();
16 map.put("key", "value");
17 return map;
18 }
19}
这样就完成了一个传统Spring MVC的开发,但是你还需要第三方服务器,如Tomcat、WebLogic等服务器去部署你的工程。在启动服务器后,再打开浏览器,输入对应的URL,如项目名称为SpringMVC则输入http://localhost:8080/SpringMVC/test.do,就可以得到图1-1所示的页面。
图1-1 测试传统的Spring MVC项目
从上面来看,传统的Spring MVC开发需要配置的内容还是比较多的,而且对设计人员要求较高。开发完成后,开发者还需要找到对应的服务器去运行,如Tomcat或者Jetty等,这样既要进行开发,又要进行配置和部署,工作量还是不少的。
而使用Spring Boot开发后,你就会发现原来一切可以那么简单。不过在入门阶段暂时不需要讨论太多的细节问题,这是未来需要讨论的问题,所以这里只展示它是如何简单而已。首先我们在IDE中创建一个Maven工程,并把其名称定义为Chapter1,这样就可以看到一个Maven配置文件pom.xml,将其内容修改为如代码清单1-4所示。
代码清单1-4 配置Spring Boot依赖环境
1<project xmlns="http://maven.apache.org/POM/4.0.0"
2xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
4http://maven.apache.org/maven-v4_0_0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6 <groupId>springboot</groupId>
7 <artifactId>chapter1</artifactId>
8 <packaging>war</packaging>
9 <version>0.0.1-SNAPSHOT</version>
10 <name>chapter1 Maven Webapp</name>
11 <url>http://maven.apache.org</url>
12 <parent>
13 <groupId>org.springframework.boot</groupId>
14 <artifactId>spring-boot-starter-parent</artifactId>
15 <version>2.0.0.RELEASE</version>
16 </parent>
17 <properties>
18 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
20 <java.version>1.8</java.version>
21 </properties>
22
23 <dependencies>
24 <!-- Spring Boot Starter依赖引入 -->
25 <!-- AOP包 -->
26 <dependency>
27 <groupId>org.springframework.boot</groupId>
28 <artifactId>spring-boot-starter-aop</artifactId>
29 </dependency>
30 <!-- Web开发包,将载入Spring MVC所需要的包,且内嵌tomcat -->
31 <dependency>
32 <groupId>org.springframework.boot</groupId>
33 <artifactId>spring-boot-starter-web</artifactId>
34 </dependency>
35 <!--加载测试依赖包 -->
36 <dependency>
37 <groupId>org.springframework.boot</groupId>
38 <artifactId>spring-boot-starter-test</artifactId>
39 <scope>test</scope>
40 </dependency>
41 </dependencies>
42 <!-- 引入插件 -->
43 <build>
44 <plugins>
45 <plugin>
46 <groupId>org.springframework.boot</groupId>
47 <artifactId>spring-boot-maven-plugin</artifactId>
48 </plugin>
49 </plugins>
50 </build>
51</project>
从加粗的代码中可以看到Maven的配置文件引入了多个Spring Boot的starter,Spring Boot会根据Maven配置的starter去寻找对应的依赖,将对应的jar包加载到工程中,而且它还会把绑定的服务器也加载到工程中,这些都不需要你再进行处理。
正如Spring Boot承诺的那样,绑定服务器,并且实现Spring的尽可能的配置,采用约定优于配置的原则。这里我们只需要开发一个类就可以运行Spring Boot的应用了,为此新建类——Chapter1Main,如代码清单1-5所示。
代码清单1-5 开发Spring Boot应用
1package com.springboot.chapter1;
2
3import java.util.HashMap;
4import java.util.Map;
5
6import org.springframework.boot.SpringApplication;
7import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
8import org.springframework.stereotype.Controller;
9import org.springframework.web.bind.annotation.RequestMapping;
10import org.springframework.web.bind.annotation.ResponseBody;
11
12
13// 启用Spring Boot自动装配
14
15public class Chapter1Main {
16 ("/test")
17
18 public Map<String, String> test() {
19 Map<String, String> map = new HashMap<String, String>();
20 map.put("key", "value");
21 return map;
22 }
23
24 public static void main(String[] args) throws Exception {
25 SpringApplication.run(Chapter1Main.class, args);
26 }
27}
好了,这个入门实例已经完结了。如果你没有接触过Spring Boot那么你会十分惊讶,这样就配置完成Spring MVC的内容了吗?我可以回答你:“是的,已经完成了,现在完全可以使用Java Application的形式去运行类Chapter1Main。”下面是Spring Boot的运行日志:
1 . ____ _ __ _ _
2 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
3( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
4 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
5 ' |____| .__|_| |_|_| |_\__, | / / / /
6 =========|_|==============|___/=/_/_/_/
7 :: Spring Boot :: (v2.0.0.RELEASE)
8
92018-03-01 22:21:55.843 INFO 16324 --- [ main]
10com.springboot.chapter1.Chapter1Main :
11Starting Chapter1Main on AFOIF-703271542 with PID 16324
12(G:\springboot\v2\chapter1\target\classes started by Administrator in
13G:\springboot\v2\chapter1)
14......
152018-03-01 22:21:57.270 INFO 16324 --- [ main]
16s.w.s.m.m.a.RequestMappingHandlerMapping :
17Mapped "{[/test]}" onto public java.util.Map<java.lang.String, java.lang.String>
18com.springboot.chapter1.Chapter1Main.test()
19......
202018-03-01 22:21:57.270 INFO 16324 --- [ main]
21com.springboot.chapter1.Chapter1Main : Started Chapter1Main in 1.845 seconds (JVM running for 2.143)
22
从日志中可以看到,Tomcat已经启动,并且将我们开发的Chapter1Main作为Spring MVC的控制器加载进来了,也将对应的路径(/test)映射到开发的test方法上。因此,接下来就可以进行测试了。打开浏览器,在地址栏输入http://localhost:8080/test,可以看到如图1-2所示的结果。
图1-2Spring Boot运行结果
与传统的Spring MVC是不是很不一样呢?从上面的对比可以看出,Spring Boot 允许直接进行开发,这就是它的优势。在传统所需要配置的地方,Spring Boot都进行了约定,也就是你可以直接以Spring Boot约定的方式进行开发和运行你的项目。
当你需要修改配置的时候,它也提供了一些快速配置的约定,犹如它所承诺的那样,尽可能地配置好Spring项目和绑定对应的服务器,使得开发人员的配置更少,更加直接地开发项目。
对于那些微服务而言,更喜欢的就是这样能够快速搭建环境的项目,而Spring Boot提供了这种可能性,同时Spring Boot还提供了监控的功能。
随着云技术的到来,微服务成了市场的热点,于是代表Java微服务时代的Spring Boot微服务开发的时代已经到来,结合Spring Cloud后它还能很方便地构建分布式系统开发,满足大部分无能力单独开发分布式架构的企业所需,所以这无疑是激动人心的技术。
荐书
《深入浅出Spring Boot 2.x》
《深入浅出Spring Boot 2.x》
作者:杨开振
本书从一个最简单的工程开始讲解Spring Boot企业级开发,其内容包含全注解下的Spring IoC和AOP、数据库编程、数据库事务、NoSQL技术、Spring MVC、Spring 5新一代响应式框架WebFlux、REST风格和Spring Cloud分布式开发等。
为了进一步简化Spring的开发,2014年Spring Boot诞生了,它是一个由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的搭建以及开发过程,并迎合时下流行的微服务思维,越来越多的企业选择了Spring Boot。随着2017年9月Spring 5.x的推出,2018年Spring Boot也推出了2.x版本,进入2.x版本时代。
基于这样的趋势,本书作者和朋友合作创作完成《Java EE互联网轻量级框架整合开发:SSM框架(Spring MVC+Spring+MyBatis)和Redis实现》后,收到了许多的读者、前同事和业内朋友的建议,他们希望我创作一本关于Spring Boot的书,来给需要学习Spring Boot的从业人员提供参考,这就是创作本书的缘起。
本书使用的Spring Boot版本
Spring Boot作为一个被市场高度关注的微服务开发框架,版本迭代十分频繁,这给我创作本书带来了极大的挑战。本书出版前还有一个有趣的插曲,在本书初创时Spring Boot的最新正式版是1.5.4,到我最初定稿时更新到了1.5.9,都是基于Spring Boot的1.x版本。
在2018年3月初,在书稿进入复审环节之前,Spring Boot发生了重大的版本更替,正式更新到了2.x的正式(GA)版本。为了与时俱进,保证本书更有参考价值,我决定将本书采用的Spring Boot版本从最初定稿的1.5.9更新到2.0.0。
因此,本书采用版本2.0.0.RELEASE进行讲解。Spring Boot 2.x和Spring Boot 1.x在使用上有很多地方存在很多不同,并且只能支持JDK 8或者以上版本,这些是读者在阅读本书和实践中需要注意的。
推荐完再免费送 10 本
1、前 5 本书送给公众号粉丝。请在文章下面留言,分享下你用 Spring Boot 以来的一些宝贵的经验,我会选出 5 条对大家有用的留言送出,期待各路码农的精彩留言,截止时间 08/08 18:00。
2、后 5 本书从知识星球活跃粉丝中选出。请查看星球上的送书活动,截止时间 08/15 18:00,扫描以下二维码付费后自动加入知识星球。
所有获赠者得到通知后,请在 24 小时内提供收获地址,过时则视为放弃。
大家有兴趣的也可点击阅读原文链接购买!