专栏首页Java技术栈Spring Boot 2.X 来临,本文将带你起飞!

Spring Boot 2.X 来临,本文将带你起飞!

当前互联网技术盛行,以Spring 框架为主导的Java 互联网技术成了主流,而基于Spring 技术衍生出来的Spring Boot,采用了“约定优于配置”的思想,极大地简化了Spring 框架的开发。

随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的热点技术。2017 年9 月,Spring 框架出现了重大版本升级,从4.x 版本升级为了5.x 版本,随着这次升级,Spring Boot的版本也在2018年3月从1.x升级到了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    @Override  
10    protected Class<?>[] getRootConfigClasses() {  
11        // 可以返回Spring的Java配置文件数组  
12        return new Class<?>[] {};  
13    }  
14
15    // DispatcherServlet的URI映射关系配置  
16    @Override  
17    protected Class<?>[] getServletConfigClasses() {  
18        // 可以返回Spring的Java配置文件数组  
19        return new Class<?>[] { WebConfig.class };  
20    }  
21
22    // DispatcherServlet拦截请求匹配  
23    @Override  
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@Configuration
20// 定义Spring MVC扫描的包
21@ComponentScan(value="com.*", 
22includeFilters = {@Filter(type = FilterType.ANNOTATION,
23       value = Controller.class)})
24// 启动Spring MVC配置
25@EnableWebMvc
26public class WebConfig {
27
28    /***
29     * 通过注解@Bean初始化视图解析器
30     * 
31     * @return ViewResolver视图解析器
32     */
33    @Bean(name = "internalResourceViewResolver")
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    @Bean(name = "requestMappingHandlerAdapter")
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@Controller
10public class TestController {
11
12    @RequestMapping("/test")
13    @ResponseBody
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@Controller
13// 启用Spring Boot自动装配
14@EnableAutoConfiguration
15public class Chapter1Main {
16    @RequestMapping("/test")
17    @ResponseBody
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后它还能很方便地构建分布式系统开发,满足大部分无能力单独开发分布式架构的企业所需,所以这无疑是激动人心的技术。

本文分享自微信公众号 - Java技术栈(javastack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot 2.1.0 已发布,7 个重大更新!

    距离《重磅:Spring Boot 2.0 正式发布!》已经过去大半年了,而 Spring Boot 2.1.0 在 10 月底就发布了,我们来看下 Sprin...

    Java技术栈
  • 两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这...

    Java技术栈
  • 最新 Spring 系列教程,都在这了!

    以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ Spring Cloud 的技术干货,本文长期更新,...

    Java技术栈
  • Spring Boot 2.1.0 已发布,7 个重大更新!

    距离《重磅:Spring Boot 2.0 正式发布!》已经过去大半年了,而 Spring Boot 2.1.0 在 10 月底就发布了,我们来看下 Sprin...

    Java技术栈
  • 你必须了解Spring的生态

    Spring不止是提供了IOC、AOP的功能,还提供了大量的基于Spring的项目,拿来用就行了,用于一站式开发,大大降低了开发的难度。 下面列举下主要的一些S...

    Java技术栈
  • [译]2020年Spring状态报告

    近日VMware发布了2020年Spring状态报告,该报告调查了1000多位不同行业的springboot开发者、架构师、技术经理,以了解企业当前如何使用Sp...

    东溪陈姓少年
  • 基于Spring Boot和Spring Cloud实现微服务架构学习(一)-Spring框架介绍

    看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感悟。

    Java搬砖工人
  • Spring,Spring MVC及Spring Boot区别

    我们说到Spring,一般指代的是Spring Framework,它是一个开源的应用程序框架,提供了一个简易的开发方式,通过这种开发方式,将避免那些可能致使代...

    用户7286770
  • 如何系统学习Spring框架

    最近有朋友私信胖哥说自己从事Java开发好几年了,但是从来没有系统学习过Spring框架,希望找到一条系统学习Spring的路线来提升一下自己。这像极了以前的我...

    码农小胖哥
  • 为什么你要用 Spring?

    现代 Spring 几乎成为了 Java 在企业级复杂应用开发的代名词,得益于 Spring 轻量简单的设计哲学和其开放包容的生态圈,确实为廉颇老矣,尚能饭否的...

    phoenix.xiao

扫码关注云+社区

领取腾讯云代金券