(一) SpringBoot起飛之路-HelloWorld

(一) 初始 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 下看一下效果,運行成功了,瀏覽器也可以訪問

結尾

如果文章中有什麼不足,歡迎大家留言交流,感謝朋友們的支持!

如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公衆號

在這裏的我們素不相識,卻都在爲了自己的夢而努力 ❤

一個堅持推送原創開發技術文章的公衆號:理想二旬不止

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章