2

(一) 初始 SpringBoot

(1) 学习之路

开发一个 Web 项目,从入门的 JavaWeb,也就是 Servlet + Tomcat 的那一套,学完了这部分,大部分人就会去接触一些框架,像SSM、SSH(少),再接着就会去接触 SpringBoot 等等,随着新框架的出现,亦或者统一框架的版本大更新,我们也需要不断的学习,其实像我平时做的很多东西,说白了也就是简单或者复杂的增删改查,根据需求掺杂着很多业务逻辑,就例如,一个简单的登陆大家在学习中应该做过N个版本了吧

当然,也有一些朋友,直接跳过了 Spring 先看 SpringBoot,然后再回头去学,不过看个人哈,我自己不太习惯, SpringBoot 背后帮你做了太多事情了,由俭入奢易,由奢入俭难,换做我,就没有回去学习的欲望了(卑微码农)

说明:

  • 如果暂时还不想看这些繁文缛节,真正的 SpringBoot 项目创建的具体实现在 "IDEA 快速创建SpringBoot项目" 标题下
  • 本来想着把一些常用的入门知识写成一篇文章再发出来,后来感觉移动端篇幅太长,阅读体验太差了,就打算分成几篇来发
  • 当然对于各位大佬来说,这根本也算不了什么,权当一篇工具文来看啦,不喜勿愤哈 ~

(2) 框架发展之路

到此看来,暂且可以粗浅的将 Java 企业级应用的开发 分为如下三个过程:Javaweb --> Spring --> SpringBoot

A:为什么用框架?

有了 JavaWeb 为什么还要用 Spring 等框架呢,我在之前的文章也说过,这些框架可以大大的减少开发的成本,却又能高效的实现一些需求,给大家摘一段,以前我写的一些浅薄的看法:

不扯什么太专业的名词,咱们就讲点大白话,大家应该都听过 “框架是一个半成品” ,这句话没毛病,框架就是封装了很多很多的代码,然后你只需要直接调用它提供给你的 API 就能直接使用它的功能

当然框架的最初意愿当然都是为了简化开发,帮助开发者快速的完成项目需求,说的确切一点,就是框架中结合了很多的设计模式,可以让你 “动态” 的开发,将代码实现了通用性,一般自己写的简单的代码,都涉及太多的 “硬编码” 问题了 ,而如果自己去写这些设计模式又太复杂了

B:为什么用 SpringBoot

Spring 帮助人们能够相对高效的快速搭建出一个企业级应用,但是配置却是相对繁琐的,在 2.5 的版本之后,引入了基于注解的组件扫描,这已经使得XML的少了很多,3.0版本以后可以使用@Configuration定义配置类,XML 也可以全部去掉了,也可以叫做纯注解开发,不过现在很多人还是习惯 XML + 注解的方式开发

  • Spring 虽然在 XML配置 在一定程度上得到了消除,但是这些配置说实话是有一些麻烦的,不可避免的就需要花费一些时间在配置上面
  • 再者,依赖的坑,真的一把鼻涕一把泪,不同版本的依赖疯狂冲突不兼容,总让我发疯

而 SpringBoot ,就是在这种背景下被开发出来的框架,它在很好的解决了我们存在的问题,能让我们开发更加容易,下面我们就来认识一下它

(2) SpringBoot 真香

A:如何解决过去的问题

SpringBoot,根据Spring等过去的一些问题,提出了约定优于配置的思想,默认的进行了很多设置,在背后帮我们做了很多事情,使得开发者可以使用少量的配置就可以快速构建项目,或者集成一些第三方的东西,开发人员就不需要为了配置而过分的花费心思,专心写业务逻辑就可以了,这使得开发的效率大幅度提升

B:基本概念

SpringBoot 也不需要理解为一个新框架,它不为了替代 Spring 而产生,它主要为了简化 Spring 的开发,其默认帮我们配置了很多框架,使得我们可以不再为了那些框架的配置过于费神,使得上手变得更加容易

SpringBoot 的官方说明:

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration

C:特点

  • 为基于Spring的开发提供更快的入门体验
  • 直接上手,没有冗余代码生成,也没有XML配置
  • 内嵌式的容器极大地简化了Web项目
  • 旨在简化 Spring,非替代Spring

SpringBoot 的官方说明:

Features

  • Create stand-alone Spring applications
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
  • Provide opinionated 'starter' dependencies to simplify your build configuration
  • Automatically configure Spring and 3rd party libraries whenever possible
  • Provide production-ready features such as metrics, health checks, and externalized configuration
  • Absolutely no code generation and no requirement for XML configuration

D:核心功能

起步依赖
  • 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能
  • 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能,你只需要告诉Spring Boot需要什么功能,它就能引入需要的库
自动配置
  • 针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置
  • 同时Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个

当经过简单的学习后,再回来看看这些话,就知道 SpringBoot 有多么强了,不过我们做不了巨人,不如我们就站在巨人的肩膀上学习! 起飞!!!

(二) Hello SpringBoot

(1) 初次体验(Maven创建)

提前说明:此方法,以后基本不会用的,只是为了第二点和第三点做铺垫,从而更好的明白,SpringBoot 的简便、自动

创建一个空工程,我们下面的几种演示方式,就分别创 mudule 就行了,自己弄得话直接创在 Project 也是一样的

A:创建 Maven Module

创建一个 Module,选择 Maven 工程,别勾选我们以前常用的 web 骨架,直接创建就行了

填好这些基本的值

GroupID 是项目组织唯一的标识符,一般来说可以设置的与包结构一致,也就是 main 目录里java 的目录结构,可以设置为域名的倒序,当然这不是强制的,例如我设置为 cn.ideal

ArtifactID 就是项目的唯一的标识符,一般设置为项目的名称

正是通过这两个值,形成了一个 “坐标” ,能保证项目的唯一性

这步也没啥好说的,大家都很熟悉

B:添加起步依赖

根据 SpringBoot 的要求,我们要进行简单的测试还需要添加其起步的依赖

  • 项目要继承SpringBoot的起步依赖 spring-boot-starter-parent
  • 为了集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖 spring-boot-starter-web
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
    </parent>

    <groupId>cn.ideal</groupId>
    <artifactId>springboot_01_start</artifactId>
    <version>1.0-SNAPSHOT</version>

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

C:编写 SpringBoot 启动类

我们的包结构现在是 cn.ideal 我们就在此目录下创建一个类叫做 MySpringBootApplication (名字不强制要求)

写入下列内容,别忘记注解,暂时只需要知道,这个启动类是很关键的,具体的解释会在后面几篇文章写

package cn.ideal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

D:创建 controller

接着就很熟悉了,我在 cn.ideal 下创建了 controller 包,接着创建了一个

package cn.ideal.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class QuickStartController {
    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        return "springboot 访问测试,起飞,飞飞飞飞 ~ ~ ~";
    }
}

E:测试 SpringBoot

打开刚才创建的 MySpringBootApplication 启动类,然后运行其主函数,控制台会这样一个图案打印出

同时会有一些信息输出,观察到这样一句 Tomcat started on port(s): 8080 (http) with context path '' 这也就是说我们可以通过 8080 端口访问,同时我们没有设置应用名,也就是直接用端口访问就行了

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.7.RELEASE)

2020-05-10 22:11:34.973  INFO 30580 --- [           main] cn.ideal.MySpringBootApplication         : Starting MySpringBootApplication on LAPTOP-5T03DV1G with PID 30580 (F:\develop\IdeaProjects\framework-code\springboot_01_demo\springboot_01_start\target\classes started by abc in F:\develop\IdeaProjects\framework-code\springboot_01_demo)
2020-05-10 22:11:34.976  INFO 30580 --- [           main] cn.ideal.MySpringBootApplication         : No active profile set, falling back to default profiles: default
2020-05-10 22:11:35.686  INFO 30580 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-05-10 22:11:35.693  INFO 30580 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-05-10 22:11:35.693  INFO 30580 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.34]
2020-05-10 22:11:35.765  INFO 30580 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-05-10 22:11:35.766  INFO 30580 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 747 ms
2020-05-10 22:11:35.884  INFO 30580 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-05-10 22:11:35.990  INFO 30580 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-10 22:11:35.993  INFO 30580 --- [           main] cn.ideal.MySpringBootApplication         : Started MySpringBootApplication in 1.318 seconds (JVM running for 2.665)

直接访问首页是一个白页,因为我们并没有设置 index 页面,所以自然会是这样

我们请求一下刚才的 controller,我们的字符串就被成功的打印出来了

(2) 官网 Web页面创建项目

这种方式也是为了第三点做铺垫,使用Spring Initializr 的 Web页面创建项目,

1、打开官网给出的 Spring Initializr 页面 https://start.spring.io/

2、把项目信息填写好,我们在第三大点讲

3、点击”Generate Project“ 按钮生成项目,然后下载这个项目

4、解压后,并用IDEA以Maven项目导入

(3) IDEA 快速创建SpringBoot项目(※)

这个是我们比较常用的创建方式

A:创建 Spring Initializr Module

一看这个 URL 是不是一下子就明白了,他默认也是去官网这个网站生成,只不过不需要再导入等等了,直接就可以在 IDEA 生成

B:填写项目信息

这个部分,首先填入 Group 和 Artifact,然后默认包名会带着我们的项目名,我们删掉就留下一个基本的包结构

关于版本我们都用默认的,当然可以根据自己的选择来改

C:选择初始化组

这一步,就是让我们你选择初始化的时候,要帮我们加载哪些组件,初学选择 Web 就行了,我在这里同时也勾选了 DevTools ,这是我们后面热部署要用到的,暂时不选也是可以的

继续确定位置和名字

到这里,我们的项目就创建好了

D:项目生成了什么

通过上面步骤完成了基础项目的创建。就会自动生成以下文件

  • 程序的主启动类,他是根据项目名来自动命名的,例如 Springboot02QuickstartApplication
  • 一个 测试类,Springboot02QuickstartApplicationTests
  • 一个 application.properties 配置文件
  • 一个 pom.xml,同时根据我们前面所选的初始化组件,帮我们自动的导入了一些依赖

可以看到,我们启动类以及pom都不需要我们自己创建了,省了很多功夫

下面给出自动生成的 pom.xml,我都加了一点注释

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.ideal</groupId>
    <artifactId>springboot_02_quickstart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_02_quickstart</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <!-- 热部署相关 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <!-- springboot单元测试相关-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <!-- 剔除依赖 -->
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- 打包插件 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(三) SpringBoot 工程热部署

继续推荐两个比较常用的东西,首先是热部署

我们在开发中经常会修改类、页面等等,每次修改后就需要重新启动,很麻烦,浪费时间,我们可以在 pom.xml 中添加如下配置就可以实现不重启使得代码生效,我们称之为热部署

(1) 添加依赖

下面是热部署的依赖,如果我们在初始化组件的时候就选择 devtools 就不需要自己添加依赖了

<!--热部署配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

配置完还不行,因为默认 IDEA 是不会自动编译的,所以我们还需要修改一些设置

(2) 修改配置

在设置中,找到编译相关的,然后将Build project automatically 勾选上

接着组合键 Shift+Ctrl+Alt+/,选择Registry

在下面找到,complier.automake.allow.when.app.running 然后勾选,接着CLOSE退出

重新启动服务器,就可以看到效果了,当我们对类等进行修改后,代码也可以直接生效了

(四) 项目打成Jar包

在上面我们存在这样一个jar包,怎么使用呢?

<plugin>
    <!-- 打包插件 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

在右侧我们可以选择 clean 然后 package 进行打包,当控制台显示 BUILD SUCCESS 后,target下就会多出一个jar包,例如我的 springboot_02_quickstart-0.0.1-SNAPSHOT.jar

成功后,我们可以指向到 target 下看一下效果,运行成功了,浏览器也可以访问

结尾

如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持!

如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号:理想二旬不止


二境志
191 声望26 粉丝