当前互联网技术盛行,以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
1packagecom.springboot.springmvc.conf;
2
3import
4org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
5publicclassMyWebAppInitializer
6extendsAbstractAnnotationConfigDispatcherServletInitializer{
7
8// Spring IoC容器配置
9@Override
10protectedClass[] getRootConfigClasses() {
11// 可以返回Spring的Java配置文件数组
12returnnewClass[] {};
13}
14
15// DispatcherServlet的URI映射关系配置
16@Override
17protectedClass[] getServletConfigClasses() {
18// 可以返回Spring的Java配置文件数组
19returnnewClass[] { WebConfig.class };
20}
21
22// DispatcherServlet拦截请求匹配
23@Override
24protectedString[] getServletMappings() {
25returnnewString[] {"*.do"};
26}
27}
注意代码中加粗的地方。这里引入了一个Java配置文件—— WebConfig.java,它的主要作用是配置Spring MVC的核心类DispatcherServlet的上下文,如代码清单1-2所示。
代码清单1-2 配置DispatcherServlet的上下文
1packagecom.springboot.springmvc.conf;
2
3importjava.util.ArrayList;
4importjava.util.List;
5importorg.springframework.context.annotation.Bean;
6importorg.springframework.context.annotation.ComponentScan;
7importorg.springframework.context.annotation.ComponentScan.Filter;
8importorg.springframework.context.annotation.Configuration;
9importorg.springframework.context.annotation.FilterType;
10importorg.springframework.http.MediaType;
11importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
12importorg.springframework.stereotype.Controller;
13importorg.springframework.web.servlet.HandlerAdapter;
14importorg.springframework.web.servlet.ViewResolver;
15importorg.springframework.web.servlet.config.annotation.EnableWebMvc;
16importorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
17importorg.springframework.web.servlet.view.InternalResourceViewResolver;
18
19@Configuration
20// 定义Spring MVC扫描的包
21@ComponentScan(value="com.*",
22includeFilters = {@Filter(type = FilterType.ANNOTATION,
23value = Controller.class)})
24// 启动Spring MVC配置
25@EnableWebMvc
26publicclassWebConfig{
27
28/***
29* 通过注解@Bean初始化视图解析器
30*
31*@returnViewResolver视图解析器
32*/
33@Bean(name ="internalResourceViewResolver")
34publicViewResolver initViewResolver() {
35InternalResourceViewResolver viewResolver
36= new InternalResourceViewResolver();
37viewResolver.setPrefix("/WEB-INF/jsp/");
38viewResolver.setSuffix(".jsp");
39returnviewResolver;
40}
41
42/**
43* 初始化RequestMappingHandlerAdapter,并加载HTTP的JSON转换器
44*
45*@returnRequestMappingHandlerAdapter 对象
46*/
47@Bean(name ="requestMappingHandlerAdapter")
48publicHandlerAdapter initRequestMappingHandlerAdapter() {
49// 创建RequestMappingHandlerAdapter适配器
50RequestMappingHandlerAdapter rmhd = new RequestMappingHandlerAdapter();
51// HTTP JSON转换器
52MappingJackson2HttpMessageConverter jsonConverter
53= new MappingJackson2HttpMessageConverter();
54// MappingJackson2HttpMessageConverter接收JSON类型消息的转换
55mediaType = MediaType.APPLICATION_JSON_UTF8;
56List mediaTypes = new ArrayList();
57mediaTypes.add(mediaType);
58// 加入转换器的支持类型
59jsonConverter.setSupportedMediaTypes(mediaTypes);
60// 给适配器加入JSON转换器
61rmhd.getMessageConverters().add(jsonConverter);
62returnrmhd;
63}
64}
通过上面的代码,配置完成Spring MVC的开发环境后,才可以开发Spring MVC控制器Controller,这样就可以开发一个简单的控制器(Controller),如代码清单1-3所示。
代码清单1-3 开发Spring MVC控制器
1package com.springboot.springmvc.controller;
2
3importjava.util.HashMap;
4importjava.util.Map;
5importorg.springframework.stereotype.Controller;
6importorg.springframework.web.bind.annotation.RequestMapping;
7importorg.springframework.web.bind.annotation.ResponseBody;
8
9@Controller
10publicclassTestController{
11
12@RequestMapping("/test")
13@ResponseBody
14publicMap test() {
15Map map =newHashMap();
16map.put("key","value");
17returnmap;
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
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">
54.0.0
6springboot
7chapter1
8
war
90.0.1-SNAPSHOT
10chapter1 Maven Webapp
11http://maven.apache.org
12
13org.springframework.boot
14spring-boot-starter-parent
152.0.0.RELEASE
16
17
18
UTF-8
19
UTF-8
201.8
21
22
23
24
25
26
27org.springframework.boot
28spring-boot-starter-aop
29
30
31
32org.springframework.boot
33spring-boot-starter-web
34
35
36
37org.springframework.boot
38spring-boot-starter-test
39test
40
41
42
43
44
45
46org.springframework.boot
47spring-boot-maven-plugin
48
49
50
51
从加粗的代码中可以看到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
3importjava.util.HashMap;
4importjava.util.Map;
5
6importorg.springframework.boot.SpringApplication;
7importorg.springframework.boot.autoconfigure.EnableAutoConfiguration;
8importorg.springframework.stereotype.Controller;
9importorg.springframework.web.bind.annotation.RequestMapping;
10importorg.springframework.web.bind.annotation.ResponseBody;
11
12@Controller
13// 启用Spring Boot自动装配
14@EnableAutoConfiguration
15publicclassChapter1Main{
16@RequestMapping("/test")
17@ResponseBody
18publicMap test() {
19Map map =newHashMap();
20map.put("key","value");
21returnmap;
22}
23
24publicstaticvoidmain(String[] args) throws Exception {
25SpringApplication.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 Administratorin
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
18com.springboot.chapter1.Chapter1Main.test()
19......
202018-03-01 22:21:57.270 INFO 16324 --- [ main]
21com.springboot.chapter1.Chapter1Main : Started Chapter1Mainin1.845 seconds (JVM runningfor2.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 本
所有获赠者得到通知后,请在 24 小时内提供收获地址,过时则视为放弃。
领取专属 10元无门槛券
私享最新 技术干货