1、Spring的简介
Spring Boot官网地址:https://spring.io/projects/spring-boot/ 目前最新的稳定版本是2.1.5
Spring Boot是Spring家族的一个产品

spring boot2揭秘 spring boot s_spring

SSM框架创建的Web工程,要使项目跑起来,需要大量的配置,有时候搭建环境都要搭建半天,各种配置文件,XML文件等等。需要我们手动配置的地方非常多,而且配置很多都是重复的,每一个工程都要去搭建环境,这样不仅徒增工作量,而且在跨平台部署时容易出问题。而使用Spring Boot可以让我们快速创建一个基于Spring的项目,而让这个Spring项目跑起来我们只需要添加少量的配置就可以了。Spring Boot主要有如下核心功能:
1、独立运行的Spring项目(Spring Boot可以以jar包的形式来运行,运行一个Spring Boot项目,我们只需要通过java -jar xx.jar类运行,非常方便)。
2、内嵌Servlet容器(Spring Boot可以内嵌tomcat,这样我们无需以war包的形式部署项目)
3、提供starter简化Maven配置(使用Spring或者SpringMVC我们需要添加大量的依赖,而这些依赖很多都是固定的,这里Spring Boot通过starter能够帮助我们简化Maven配置)。
4、自动配置Spring
5、准生产的应用监控
6、无代码生成和xml配置

Spring Boot目前最新的2.1.5版本对运行环境的要求:
1、JDK8以上
2、编译java11
3、Spring 5.1.7
4、构建工具 Maven3.3以上,Grade4.4以上
5、Tomcat 9.0,servlet4.0(自带)

2、Spring Boot项目的创建

Spring Boot本质上就是一个Maven工程,但是它在创建过程中需要添加parent和Maven插件,初学者总会怀疑它到底是不是Maven工程,实际上它就是Maven,因为它要加的东西比较多,所以我们有几种不同的方式来创建它。

2.1 在线创建

在线创建网址https://start.spring.io/

spring boot2揭秘 spring boot s_spring boot2揭秘_02

spring boot2揭秘 spring boot s_spring_03

使用开发工具打开解压后的文件就可以在里面进行开发了2.2 开发工具创建

spring boot2揭秘 spring boot s_Spring Boot_04

然后输入项目名包名等

spring boot2揭秘 spring boot s_Spring Boot_05

选择依赖

spring boot2揭秘 spring boot s_spring_06

创建成功,和在线创建的是一样的

spring boot2揭秘 spring boot s_spring_07


2.3 使用Maven创建

使用Maven创建无论是在什么情况下都能创建成功,不依赖网站,首先创建一个普通的Maven工程,在pom.xml文件中添加web依赖,因为没有添加parent所以需要手动添加版本号

<dependency>
            <!-- spring-boot-starter-xx是spring boot官方提供的依赖
                 xx-spring-boot-starter就不是官方提供的
            -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.5.RELEASE</version>
        </dependency>
    </dependencies>

创建Spring Boot的启动类

@SpringBootApplication
public class App {
    public static void main(String[] args){
        SpringApplication.run(App.class,args);
    }
}

创建一个控制器用于测试

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello spring boot!";
    }
}

通过启动App类来启动Spring Boot工程

spring boot2揭秘 spring boot s_tomcat_08


3、Spring Boot中的parent的含义

对于大家来说有没有parent最直观的感受就是,在pom.xml文件中要不要加版本号,有parent要加版本号,版本号在parent中都是定义好了的。那么parent到底要不要加呢?这是分情况的,我们现在自己是可以加的,但是如果是在公司里面开发,不一定加,因为一个Maven项目只能有一个parent,如果加了这个默认的parent,意味着我就不能再加其他的parent了,但是在公司里面,一般我们的项目可能需要集中管理,公司自己会提供一个父工程,所有的工程的parent都要是公司定义好的parent,这样就只能继承自公司的parent,就不能自己写parent了。那这种时候parent里面提供的东西,我们该如何处理。

parent提供的功能包括:
1、定义了java编译版本为1.8
2、使用了UTF-8格式编码
3、继承自spring-boot-dependencies,这里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
4、执行打包操作的配置
5、自动化的资源过滤
6、自动化的插件配置
7、针对application.properties和application.yml的资源过滤,包括通过profile定义的不同环境的配置文件,例如application-dev.properties和application-dev.yml

请注意,由于application.properties和application.yml文件接受Spring样式占位符$ {…}, 因此Maven过滤更改为使用@ … @占位符,当然开发者可以通过设置名为resource.delimiter的Maven屈性来覆盖@ … @占位符。

当我们创建一个Spring Boot项目后,我们可以在本地Maven仓库中看到这个具体的parent文件在本地仓库的C:\Users\豆子.m2\repository\org\springframework\boot目录下可以找到你要找的parent的名称目录下,找到使用的版本名的文件下,里面有一个.pom文件,文件里面有具体的配置。

版本相关配置

spring boot2揭秘 spring boot s_spring_09

文件过滤

spring boot2揭秘 spring boot s_Spring Boot_10

它自己也有一个parent,里面定义了所有依赖的版本号。

如果要使用公司的parent,那就不能自己定义parent了,这就只能自己把parent中所定义的配置,版本号,资源过滤等等自己手动定义好。或者把这些配置定义到公司指定的parent上

可以自己定义dependencyManagement就不用写版本号了

spring boot2揭秘 spring boot s_jetty_11


4、项目结构介绍

spring boot2揭秘 spring boot s_jetty_12

5、启动类

我们发现Spring Boot项目一创建就可以使用,可以扫描到所有的注解,那么Spring Boot没有XML文件,那就肯定是像上一篇一样,是用注解的方式扫描的。我们可以看到在启动类中加了一个注解叫@SpringBootApplication,进入这个注解我们可以看到

spring boot2揭秘 spring boot s_Spring Boot_13

而在@SpringBootConfiguration注解中其实就是三个注解组合的。

第一个@Configuration注解(配置类注解)

spring boot2揭秘 spring boot s_Spring Boot_14

第二个@EnableAutoConfiguration注解是开启SpringMVC的自动化配置。

第三个@ComponentScan注解(默认扫描当前类所在包下面的所有bean,以及当前类所在的包下面的子包下面的所有备案)所以以下配置不写具体的包位置,只除去了不用扫描的,所以我们在定义的时候一般会把启动类放在根包下,如果非要放在其他包,那就在启动类从新指定@ComponenScan,重新指定basepackage。

spring boot2揭秘 spring boot s_jetty_15


@SpringBootApplication是一个组合注解,组合注解就是把几个注解组合在一起,它具有那几个注解的所有功能。也可以在启动类的前面加这三个注解,同样能实现。6、banner配置

banner就是在Spring Boot工程启动的时候出现的横幅:

spring boot2揭秘 spring boot s_spring boot2揭秘_16

它可以自定义:在resources下定义一个文件banner.txt,启动时就会按照你指定的文件来显示,否则就按自定义的来。定制字体网站http://patorjk.com/software/taag/

spring boot2揭秘 spring boot s_tomcat_17


如果不想使用这个横幅也可以关掉,在启动类中这样配置:

@SpringBootApplication
public class Demo02Application {

    public static void main(String[] args) {
        SpringApplication build = new SpringApplicationBuilder(Demo02Application.class).build();
        build.setBannerMode(Banner.Mode.OFF);
        build.run(args);
       // SpringApplication.run(Demo02Application.class, args);
    }

}

这样再次启动工程就没有banner了。

7、web容器配置
当Spring Boot工程启动的时候,默认的端口是8080,用的tomcat不是本地的tomcat,而是内嵌在Spring Boot里面的tomcat。那么对于在这个tomcat的配置,我们该如何去修改呢?(本地的tomcat可以在tomcat目录下server.xml文件下修改)

在application.properties文件中修改

#修改tomcat的端口号
server.port=8088
#解决乱码问题:http://www.javaboy.org/2019-04-09/javaweb-encoding.html
#post乱码,post参数如果放在请求体里面(也可以放在地址栏),request.setCharacterEncoding。在web.xml文件中配置的过滤器,解决的也是请求体的乱码问题,以及响应的乱码问题
#get请求的乱码,get参数放在url地址里面,所以要修改地址栏的url编码,也就是以前在tomcat文件中的server.xml中配置的URLEncoding
server.tomcat.uri-encoding=UTF-8
#工程名,路径前缀
server.servlet.context-path=/aaa

配置了server.servlet.context-path=/aaa后,项目启动访问就要在路径前面加上/aaa

spring boot2揭秘 spring boot s_spring_18

Spring Boot内嵌Tomcat,那如果我不想用Tomcat,想换一个其他的容器,又该如何配置呢?

把tomcat从依赖中排除掉,再加入需要的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除tomcat-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
 <!-- 加入jetty依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

现在点击启动,就是以jetty来启动的了,配置文件中的

server.port=8088和server.servlet.context-path=/aaa在jetty中也同样适用。但是server.tomcat.uri-encoding=UTF-8是没有用的。jetty有自己的配置,可以重新配置。

spring boot2揭秘 spring boot s_Spring Boot_19