SpringBoot入门篇

前言

在普通的java项目中,大量的xml文件配置起来相当繁琐,导致了开发效率非常低下,整合第三方框架的配置可能会存在冲突问题导致部署效率低,打包方式是将项目打成一个war包放入到tomactwebapps目录下执行。简单来说,传统的开发方式有以下令人苦恼的的特点

  • 笨重的开发
  • 繁琐的配置
  • 低下的开发效率
  • 复杂的部署流程
  • 集成第三方难度大

为了解决以上问题,SpringBoot被提出来了,它设计的目的就是为了简化Spring应用的初始搭建及开发过程,其约定大于配置,去繁从简。

看到这里,你觉得我是在吹牛逼,SpringBoot真的有那么优秀么?如果,你还是不信,咱们去官网的开发文档瞅一瞅,

打开SpringBoot官网,打开文档,让我们一探究竟。

乘风破浪,SpringBoot入门_java

文档里有这样一段话介绍SpringBoot框架的特点

乘风破浪,SpringBoot入门_java_02

因为全是英文,我直接精炼下给你看,SpringBoot的优点总结如下:

  • 快速整合第三方框架(Maven依赖关系,Maven继承)
  • 打包方式完全采用注解,采用注解方式启动SpringMVC,SpringBoot Web组件集成SpringMVC框架
  • 简化xml配置
  • 内置嵌入Http服务器(默认为Tomcat、Jetty),降低了对环境的要求
  • 最终以java应用程序进行执行(SpringBoot项目中没有Web.xml),运行中应用状态的监控。
  • Starters自动依赖于版本控制

工欲善其事,必先利其器,既然SpringBoot有那么多优点,我们肯定是要好好学的。在学习SpringBoot之前,需要搭建SpringBoot工程,那么问题来了,正在看文章的你知道怎么搭建SpringBoot工程么?它有几种方式呢?这些方式各自有什么特点及联系?工程是如何启动的呢?

文章目录

1、SpringBoot创建的三种方式

2、程序是如何执行的

3、目录结构

方式一:网上在线创建

这种方式是在网上在线创建,然后可以导出压缩包,解压后的文件就是一个SpringBoot工程文件。

访问https://start.spring.io/,打开后就是一个创建工程页面,

乘风破浪,SpringBoot入门_java_03

Project:选择创建工程的方式,可以使用Maven或者Cradle,这里我们采用Maven方式创建

Language:开发语言的选择,我们选择的Java

SpringBoot: SpringBoot的版本,选择的是2.3.3

Project Metadata: 项目信息

Group 和 Artifact :项目坐标

Name:项目名称

Description:对工程的描述

Package name: 项目内的包名称

Packaging:打包方式,我们这里的选择的是jar包

Java: Java语言的版本,这里选择是11

Dependencies:添加依赖,这里我们仅仅添加Spring Web,它包含了Spring、SpringMVC一整套东西

每个选项都选择好,就可以直接生成一个工程文件压缩包了,我们只需要使用开发工具(Intellij IDEA)打开即可。

方式二:使用IDEA的spring Initializer

方式二是在IDEA使用Spring Initializer直接创建

乘风破浪,SpringBoot入门_java_04

可以看出,Spring Initializer与方式一相同,默认采用

https://start.spring.io创建
乘风破浪,SpringBoot入门_java_05 乘风破浪,SpringBoot入门_java_06

同方式一相同,填写坐标、语言、项目名称、项目描述和加载依赖等信息。

NOTE

方式一和方式二创建工程时都需要联网,本质上都是在https://start.spring.io网址上完成的,一旦网址加载速度慢或者打不开。因为SpringBoot工程本质上就是一个Maven工程,我们可以在Maven工程的基础上改造为SpringBoot工程

方式三:改造Maven工程创建SpringBoot

我们首先创建一个Maven工程

填写坐标

确定项目名称

在pom文件中加入以下信息

<!--父依赖-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
    </parent>

  <dependencies>
      <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>
   

添加启动类


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

深入理解程序的执行

1、Pom文件

1、父项目

  • 父项目
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
    </parent>
  • spring-boot-starter-parent的父项目是
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>

spring-boot-dependencies管理了SpingBoot应用中的所有依赖,它是SpringBoot的版本仲裁中心,以后我们导入依赖时默认是不需要写版本的(没有在dependencies里面管理的依赖自然需要声明版本号) 。

2、启动器

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

spring-boot-starter: 是SpringBoot的场景启动器,spring-boot-starter-web帮我们导入了web模块正常运行所依赖的组件

深入spring-boot-starter-web的底层,我们可以看到它集成常用web模块

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

NOTE:Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器

2、主程序类(入口类)

@SpringBootApplication//@SpringBootApplication 来标注一个主程序类,说明这是一个SpringBoot应用
public class demo1 {
    public static void main(String[] args) {
  //让Spring应用启动起来
        SpringApplication.run(demo1.class,args);
    }
}

@SpringBootApplication:标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用

打开SpringBootApplication的底层,发现它是一个组合注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
//包扫描,扫描的是与启动类同一层的包及其子包
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
  • @SpringBootConfiguration表明是SpringBoot的配置类

打开@SpringBootConfiguration底层

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

@Configuration:表明是一个配置类,配置类的作用等同于配置文件

  • EnableAutoConfiguration

    @EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效。

打开@EnableAutoConfiguration

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自动配置包

@Import({Registrar.class})

将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器

@Import(AutoConfigurationPackages.Registrar.class)

给容器导入组件

EnableAutoConfigurationImportSelector:导入哪些组件的选择器

将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器,会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件, 并配置好这些组件。

3、resources文件夹下的目录结构

  • static:保存所有的静态资源;js css  images
  • templates:保存所有的模板页面(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面),可以使用模板引擎(freemarker、thymeleaf)
  • application.properties:Spring Boot应用的配置文件,可以修改一些默认设置