java语言简单、安全、支持多线程、高性能和多年javaEE的技术积累,能够快速、安全、高性能地构建互联网项目。

1.Spring 的历史​​​​​

在Spring框架没有开发出来时,javaEE是以Sun公司所制定EJB(Enterprise Java Bean)作为标准的。在"遥远"的EJB年代,开发一个EJB需要大量的接口和配置文件,直至EJB2.0的年代,开发一个EJB还需要配置两个文件,其结果就是配置的工作量比开发的工作量还要大。其次EJB是运行在EJB容器中的,而sun公司定义的JSP和Servlet却是运行在Web容器中的,于是你可以想象得到,需要使用Web容器去调用EJB容器的服务。这就意味着存在以下的弊端:

  • 需要增加调用的配置文件才能让Web容器调用EJB容器;
  • 与此同时需要开发两个容器,非常多的配置内容和繁琐的规范导致开发效率十分低下,这非常让当时的开发者诟病;
  • 对于Web容器调用EJB容器的服务这种模式,注定了需要通过网络传递,造成性能不佳;
  • 对于测试人员还需要了解许多EJB繁琐的细节,才能进行配置和测试,这样测试也难以运行。

2004年 ,Spring成为了现实中JavaEE开发的标准。

  • Spring以强大的控制反转(IOC)来管理各类Java资源,从而降低了各种资源的耦合;
  • 并且提供了极低的侵入性,也就是使用Spring框架开发的编码,脱离了SpringAPI也可以继续使用;
  • 而Spring的面向切面的编程(AOP)通过动态代理技术,允许我们按照约定进行配置编程,进而增强了Bean的功能,它擦除了大量重复的代码,如数据库编程所需大量的try…catch…finally…语句以及数据库事务控制代码逻辑,使得开发人员更加集中精力于业务开发,而非资源功能性开发;
  • Spring还提供许多整合了当时非常六次那个的框架的模板,如持久层Hibernate的HibernateTemplate模板、IBATIS的SqlMapClientTemplate模板等,极大地融合并简化了当时主流技术的使用,使得其展示了强有力的生命力,并延续到至今。

2.注解还是XML

Spring1.x:早期(JDK5之前),不支持注解,只能用XML;后期(JDK5之后),一派使用注解,一派使用XML。

Spring2.x:引入了少量的注解,如@Component、@Service等,但是功能还不够强大,因此绝大部分是以使用XML为主,注解为辅。

Spring3.0之后,形成了这样的一个不成文的共识,对于业务类使用注解,例如,对于MVC开发,控制器使用@Controller,业务层使用@Service,持久层使用@Repository;而对于一些公用的Bean,例如,对于数据库(如Redis)、第三方资源等则使用XML进行配置,纸质今时今日这样的配置方式还在企业中广泛地使用着。也许使用注解还是XML是一个长期存在的话题,但是无论如何都有道理。

随着注解的功能增强,尤其是Servlet3.0规范的提出,Web容器可以脱落web.xml的部署,使得Web容器完全可以基于注解开发,对于Spring3.x和Spring4.x的版本注解功能越来越强大,对于XML的依赖越来越少。

到了4.x的版本后甚至可以完全脱离XML,因此在Spring中使用注解开发占据了主流的地位。

与此同时,Pivotal团队在原有Spring的基础上主要通过注解的方式继续简化了Spring框架的开发,它基于Spring框架开发了Spring Boot,所以Spring Boot并非是代替Spring框架,而是让Spring框架更加容易得到快速的使用。

Pivotal 团队2014年推出Spring Boot 1.0,该版本使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

2018年3月Spring Boot推出了2.0.0 GA版本,该版本是基于Spring5的,并引入其最新的功能,能够有效支持Java9的开发。Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application devlopment)借助JavaEE在企业互联网的强势地位成伟业界领导者,它也是近年来Java开发最令人感到惊喜的项目之一。

随着近年来微服务的流行,越来越多的企业需要快速的开发,而Spring Boot除了以注解为主的开发,还有其他的绑定,例如,对服务器进行了绑定和默认对Spring的最大化配置,所以开发者能够尽快进行开发代码、发布和测试自己的项目。这符合了现今微服务快速开发、测试和部署的需要,于是越来越多的企业选择Spring Boot 作为开发的选型,进而使得Spring Boot更加兴旺起来。本书主要就是论述Spring Boot 这以令人激动的开发工具。

3.Spring Boot的优点

    谈到Spring Boo,就让我们先来了解他的优点。依据官方的文档,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的特色,下节将分别展示传统SpringMVC项目和建议的Spring Boot入门实例,并进行比较。

4.传统Spring MVC和Spring Boot的对比

在传统的SpringMVC项目开发中,开发一个简易的SpringMVC项目,需要配置DispatcherServlet,也需要配置Spring IOC的容器。可以选择使用web.xml的配置来实现,当然,如果使用的是Servlet3.1规范,也可以继承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer来配置Spring MVC项目。这里先给出可以运行的代码示例,即是还不熟悉Spring MVC也没有关系,这里只是为了说明开发比较繁琐而已,后面将详谈Spring MVC的开发原理。

假设已经带入需要的Spring和Spring MVC相关的依赖包到工程中,那么就可以开始配置DispatcherServlet了。例如,代码清单1-1就是通过继承AbstractAnnotationConfigDispatcherServletInitializer的方式来配置Spring MVC的DispatcherServlat的。

代码清单1-1 配置Spring MVC

package com.springboot.springmvc.conf;import org.springframe.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitialize;
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitialize{//Spring IOC容器配置@Overrideprotected Class<?>[] getRootConfigClasses(){//可以返回Spring的Java配置文件数组return new Class<?>[]{};}//DispatcherServlet的URI的映射关系配置@Overrideprotected Class<?>[] getServletConfigClasses(){//可以返回Spring的Java配置文件数组return new Class<?>[]{WebConfig.class};}//DispatcherServlet拦截请求匹配@Overrideprotected String[] getServletMappings(){return new String[]{"*.do"};}}

注意代码中引入了一个Java配置文件——WebConfig.java,它的主要作用是配置Spring MVC的核心类DispatcherServlet的上下文,如代码清单1-2所示。

代码清单1-2 配置DispatcherServlet的上下文

package com.springboot.springmvc.conf;import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandleAdapter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
//定义Spring MVC扫描包
@ComponentScan(value ="com.*",includeFilters = {@Filter(type = FilterType.ANNOTATION, value = Collector.class)})
@EnableWebMvc
public class WebConfig {/*** 通过注解@Bean初始化视图解析器** @return viewResolver 视图解析器*/@Bean(name="internalResourceViewResolver")public ViewResolver initViewResolver(){InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");return viewResolver;}/*** 初始化 RequestMappingHandlerAdapter,并加载HTTP的JSON转换器** @return RequestMappingHandlerAdapter 对象*/@Bean(name="requestMappingHandlerAdapter")public HandlerAdapter initRequestMappingHandlerAdapter(){//创建 RequestMappingHandlerAdapter 适配器RequestMappingHandlerAdapter rmhd = new RequestMappingHandlerAdapter();//HTTP JSON转换器MappingJackson2HttpMessageConverter jsonConverter = new RequestMappingHandlerAdapter();//MappingJackson2HttpMessageConverter 接收JSON类型消息的转换mediaType = MediaType.APPLICATION_JSON_UTF8;List<MediaType> mediaTypes = new ArrayList<MediaType>();mediaTypes.add(mediaType);//加入转换器的支持类型jsonConverter.setSupportedMediaTypes(mediaTypes);//给适配器加入JSON转化器rmhd.getMessageConverters().add(jsonConverter);return rmhd;}}

通过上面的代码,配置完成Spring MVC的开发环境后,才可以开发Spring MVC控制器Controller,这样就可以开发一个简单的控制器(Controller),如代码清单1-3所示。

  代码清单1-3 开发Spring MVC控制器

package com.springboot.springmvc.controller;import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class TestController{@RequestMapping("/test")@ResponseBodypublic Map<String,String> test(){Map<String,String> map = new HashMap<String,String>();map.put("key","value");return map;}
}

这样就完成了一个传统Spring MVC的开发,但是还需要第三方服务器,如Tomcat、WebLogic等服务器去部署的工程。在启动服务器后,再打开浏览器,输入对应的URL,如项目名称为SpringMVC则输入http://localhost:8080/SpringMVC/test.do,就可以得到图1-1的页面。

从上面来看,传统的Spring MVC开发需要配置的内容还是比较多的,而且对设计人员要求较高。开发完成后,开发者还需要找到对应的服务器去运行,如Tomcat或者Jetty等,这样既要进行开发,又要进行配置和部署,工作量还是不少的。

而使用Spring Boot开发后,你就会发现原来一切可以那么简单。不过在入门阶段暂时不需要讨论太多的细节问题,这是未来需要讨论的问题,所以这里只展示它是如何简单而已。首先我们在IDE中创建一个Maven工程,并把其名称定义为Chapter1,这样就可以看到一个Maven配置文件pom.xml,将其内容修改为如代码清单1-4所示。

代码清单1-4 配置Spring Boot依赖环境

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>springboot</groupId><artifactId>chapter1</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>chapter1 Maven Webapp</name><url>http://maven.apache.org</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!-- Spring Boot Starter依赖引入--><!-- AOP包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Web开发包,将载入Spring MVC所需要的包,且内嵌tomcat --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 加载测试依赖包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 引入插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plagin</artifactId></plugin></plugins></build>
</project>

从以上代码中可以看到Maven的配置文件引入了多个Spring Boot的starter,Spring Boot会根据Maven配置的starter去寻找对应的依赖,将对应的jar包加载到工程中,而且它还会把绑定的服务器也加载到工程中,这些都不需要你在进行处理。正如Spring Boot承诺的那样,绑定服务器,并且实现Spring的尽可能的配置,采用约定优于配置的原则。这里我们只需要开发一个类就可以运行Spring Boot的应用了,为此新建类——Chapter1Main,如代码清单1-5所示。

代码清单1-5 开发Spring Boot应用

package com.springboot.chapter1.main;import java.util.HashMap;
import java.util.Map;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@SpringBootApplication
@Controller
//启用Spring Boot自动装配
@EnableAutoConfiguration
public class Chapter1Main {public static void main(String[] args) {SpringApplication.run(Chapter1Main.class, args);}@RequestMapping("/test")@ResponseBodypublic Map<String, String> test() {Map<String, String> map = new HashMap<>();map.put("key1", "value1");return map;}
}

这个入门实例已经完结了。现在完全可以使用Java Application的形式去运行类Chapter1Main。运行之后,从日志中可以看到,Tomcat已经启动,并且将我们开发的Chapter1Main作为Spring MVC的控制器加载进来了,也将对应的路径(/test)映射到开发的test方法上。接下来就可以进行测试了。打开浏览器,在地址栏输入http:localhost:8080/test,可以看到如图1-2所示的结果。

与传统的Spring MVC不一样,Spring Boot允许直接运行开发,这就是它的优势。在传统所需要配置的地方,Spring Boot都进行约定,也就是你可以直接以Spring Boot约定的方式进行开发和运行项目。当需要修改配置的时候,它也提供了一些快速配置的约定,犹如他所承诺的那样,尽可能地配置好Spring项目和绑定对应的服务器,使得开发人员的配置更少,更加直接地开发项目。对于那些微服务而言,更喜欢的就是这样能够快速搭建环境的项目,而Spring Boot提供了这种可能性,同时Spring Boot还提供了监控的功能,随着云技术的到来,微服务成了市场的热点,于是代表Java微服务时代的Spring Boot微服务开发的时代已经到来,结合Spring Cloud后它还能很方便地构建分布式系统开发,满足大部分无能力单独开发分布式架构的企业所需,所以这无疑是激动人心的技术。后面的章节让我们就走进Spring Boot开发的森林中。

深入浅出Spring Boot 2.x——第一章Spring Boot来临相关推荐

  1. spring in action学习-第一章 spring之旅

    首先我先吐槽一下这本书的封面图,我能理解成一个包着头巾的男人举着个水壶昂首挺胸,最后给你个眼神....开玩笑的这幅插图是约旦西南部卡拉克省的居民,那里的山顶有座城堡,对死海和平原有极佳的视野,这幅图出 ...

  2. Spring实战 | 第一部分 Spring的核心(第一章 Spring之旅)

    Spring的bean容器 介绍Spring的核心模块 更为强大的Spring生态系统 Spring的新功能 一.简化java开发 为了降低Spring开发的复杂性,Spring采取了以下4钟关键策略 ...

  3. 19年8月 字母哥 第一章 spring boot 2.x基础及概念入门 这里全部看完了 热部署没出来 第二章在前面2页 用热点公司网不行

    http://springboot.zimug.com/1233100   文档 http://www.zimug.com/page/5     字母哥个人博客 11111 第一章 spring bo ...

  4. 框架设计--第一章 Spring的基本应用--习题答案

    摘要:微信搜索[三桥君] 课程介绍:"框架技术"是软件工程专业的核心课程,是本专业限选课,是Java 应用开发课程,是本专业学生就业的主要方向. 说明:框架设计其他章节的习题答案也 ...

  5. 第一章 Spring基础

    第一章 Spring基础 1.1 Spring介绍 Spring是一个框架,框架是高度抽取.可重用的代码的一种设计.Spring就是多个可重用的模块的集合,从而形成一个领域的整体解决方案. Sprin ...

  6. 第一章 Spring的简单剖析

          第一章 Spring的简单剖析 简单的说Spring是什么呢?如果单从字面上理解它,可以解释为: 春天, 跃起, 弹性-.中国有句名言:"一年四季在于春".在字面可以想 ...

  7. 跟我学spring security系列文章第一章 实现一个基本的登入

    文章目录 指定依赖 安全配置 添加controller测试代码 测试 源码地址: https://github.com/pony-maggie/spring-security-learn 指定依赖 s ...

  8. Spring Cloud学习系列第一章:Eureka之服务注册与发现

    一.Spring Cloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样 ...

  9. Spring 学记 (第一章)

    写在前面:分享技术,共同进步,有不足请见谅,相关意见可评论告知 ~ 编程路漫之远兮,简犹春天之临兮: 劝君专注案前事,亦是杯酒敬苍生: 文章目录 引入 概述 组成模块 IoC基础 启航 关于bean ...

  10. 《Spring实战》第一章 — Spring之旅

    2019独角兽企业重金招聘Python工程师标准>>> 1.1 使用Spring简化Java开发 为了降低Java开发,Spring使用了一下4种关键策略: 基于POJO的轻量级和最 ...

最新文章

  1. OpenMP入门教程
  2. 三十八、Vue项目上手 | 用户管理系统(上篇)
  3. oracle中如何插入
  4. Sentinel(二十三)之使用Apollo存储规则
  5. 使用计算机管理文件教后反思,《管理计算机中的文件》教学反思
  6. 用Python标准库turtle画一头金牛,祝您新年牛气冲天!
  7. 唏嘘!一代手机OS退场:没生态、没开发者是失败主因
  8. BYOD提升企业生产力的5种方式
  9. 知名网络安全专家访谈记
  10. 开源BI工具superset的安装使用
  11. 小米路由器设置:网桥模式以及IPv6
  12. 【操作系统】 2.2 调度概念以及调度算法
  13. 记录蓝屏问题FAULTY_HARDWARE_CORRUPTED_PAGE
  14. 最流行的Python编辑器/IDEs你认识吗?
  15. 用latex写毕业论文--设置附录、参考文献、致谢环境
  16. 机器学习、数据分析类面经分享(美的_秋招_校招_20170924)
  17. 电脑版微信累积文件缓存清理小方法
  18. SAP CO11N/CO15工单报工BADI增强出口(保存前、保存后、数据验证)
  19. leetcode-004-0811. 硬币
  20. Delphi实现局域网聊天01

热门文章

  1. IP 防护等级技术白皮书
  2. STM32_OLED显示
  3. max3232ese_max3232中文资料汇总(max3232引脚功能图_特性参数及应用电路)
  4. 邮件服务器1---原理以及基本概念
  5. 微型计算机原理与接口技术第二版答案邹逢兴,清华大学出版社-图书详情-《微型计算机原理与接口技术教学辅导(第2版)》...
  6. 信息学奥赛c++ 初学保姆级教程
  7. 北京小升初混战:有家长给孩子报7个奥数班
  8. 存算一体——后摩尔时代的AI芯片架构
  9. ITIL配置管理流程设计
  10. 苹果怎么登录服务器未响应,苹果 App Store 无法登陆的原因以及解决办法