「純手打」2萬字長文從0開始Spring Boot(上)

微信公衆號:代碼宇宙。只爲不一樣的編碼體驗。

SpringBoot 看似非龐然大物,卻又是整個 Spring Framework 的精華,本文儘可能的基於對 SpringBoot 官方文檔進行入門式講解,示例儘可能的簡單易懂,目的就是幫助你快速上手,希望對你學習 SpringBoot 有所幫助。

鑑於 SpringBoot 版本變化或環境不同容易導致難以解決的問題,筆者假定讀者 Spring Boot 版本爲 2.2.5,並且編輯器爲 Intellij IDEA 2019.3.1

1. SpringBoot 是什麼?

引用 Spring Boot 官方介紹說明

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.Most Spring Boot applications need very little Spring configuration.

SpringBoot 使創建基於 Spring 基於生產級的應用變得簡單,你只需要去運行它。大多數 SpringBoot 應用程序僅僅需要很少的 Spring 配置。

2. 核心概念

相信接觸過 Spring 的同學都領略過 Spring 的強大,但是繁瑣又容易出錯的的 XML 配置又時長讓人抓狂,SpringBoot 的問世,就是來解決的這個問題的。

SpringBoot 讓多數依賴開箱即用,或僅需少量 yml配置,這樣的好處完全取決於 SpringBoot使用了約定大於配置的設計。

  • 開箱即用,隨着需求變化你可以修改自動配置的默認值,來適應業務發展。

  • 提供一系列大型項目通用的非功能性功能(例如嵌入式服務器,安全性,指標,運行狀況檢查和外部化配置)。

  • 完全沒有代碼生成,也不需要XML配置。

3. 環境搭建

在搭建環境之前你需要準備好 Maven 3.3+ 版本並且安裝了 JDK1.8

SpringBoot 官方提供了 MvaenSpring Boot CLIGradleSDKMANMacPorts 等等安裝SpringBoot的方式,我們從簡出發,不使用這些安裝方式,直接使用 https://spring.io/ + IDEA 來開始第一個應用程序

依次打開 IDEA,File > New > Project 選擇 Spring Initializr 然後 Next 可以看到填寫項目信息界面如下

繼續 Next,會讓我們選擇項目依賴,沒錯,以後這些事情都可以交給 IDEA 來做,但是處於學習目的我們直接一路 Next,輸入項目名:SpringBootDemo(當然你可以自由發揮項目名字,但是我推薦你和我使用一樣的項目名),至於依賴嘛,待會~ 我們手動添加。

首先,不熟悉 Maven的同學注意了,在項目第一次打開的時候,IDEA會提示你是否導入依賴,建議你選擇自動導入。

至此,項目搭建完成,項目結構如下:

DemoApplication 就是 SpringBoot的啓動類,直接 右鍵 > Run 運行一下試試

這就完了?爲什麼一運行就結束了呢?難道不應該蹦出瀏覽器顯示 HelloWolrd 麼?

因爲在開始的時候並沒有選擇 SpringMvVC 作爲依賴項,目前項目僅僅是 SpringBoot 的骨架程序。

,只是一個空殼子啊。莫慌,下面,引入 mvc。

4. 引入 Spring MVC

首先,我們打開 MavenSpringBoot的官方倉庫:https://mvnrepository.com/artifact/org.springframework.boot

該倉庫包含了近乎所有官方支持的 Starter 依賴,你可以理解 Starter 依賴是遵循 SpringBoot 依賴大於配置的約定構建的軟件包,它可以讓我們開箱即用

進入 Spring Boot Web Starter 2.2.5頁面,下面輸入框內就是我們要找的東西

XML 複製到項目中 pom.xml 中,複製完後記得按一下 ctrl + s 激活一下自動導入

配置完了 SpringBoot MVC 直接啓動一下,會發現程序監聽了 8080 端口,雖然我們沒有編寫任何的配置文件,但是 SpringBoot 已經幫我們做了好幾件事:

  • 端口默認配置
  • 默認的視圖解析器
  • 默認的包掃描配置
  • 等等等等

嘗試修改端口,在 application.properties 中添加配置
server.port=1024
再次啓動,發現 程序監聽端口由 8080 變爲了 1024

剛纔的操作,稱之爲 覆蓋 SpringBoot 默認配置,可以覆蓋的默認配置有很多,更多的配置可查閱 spring-boot-autoconfigure-2.2.5.RELEASE.jar 下的 web 包,這裏不做太多介紹,至此 年輕人第一個 SpringBoot 程序構建完成。

5. 第一個靜態資源訪問

在沒有配置任何的視圖解析器的情況下,Spring MVC 默認只可以進行靜態資源訪問,比如 html、css、js、圖片等等,下面我們就試一下訪問靜態資源吧,直接開搞!

在resources目錄下新建文件夾 static ,然後新建 index.html 文件如下:
在這裏插入圖片描述
第一個靜態資源就完成了,那麼,爲什麼是 static,不是 lalala,不是 hahaha

這就要說到 SpringBoot 的默認配置了,SpringBoot 默認約定 resources 目錄下 staticpublic、以及根目錄爲靜態資源的位置,源碼配置如下,大家可以參閱

在這裏插入圖片描述
全部新建完畢後,我們啓動服務,訪問 http://localhost:1024/index.html 試試
在這裏插入圖片描述
Nice,所有的靜態資源你都可以放在 static 下面,而不用去配置任何東西,如果你想放在其他目錄下,則需要在 application.properties 中配置如下內容:

spring.resources.static-locations= 'classpath:/web-app/static/'

6. 第一個接口

配置完 SpringMVC ,接下來要幹嘛?當然是寫接口了!

com.example.demo 下新建包 controller (控制器的意思,相當於 Servlet),在 controller下新建類 HelloController 如下:

在這裏插入圖片描述
@Controller註解標識該類是一個 web 接口類,你可以理解爲是一個 Servlet@RequestMapping("/api") 標識該接口的訪問地址,比如這個接口的訪問地址就是 :http:xxx:8080/api

下面我們新建一個方法,照着寫即可,接下來會詳細講 爲什麼

在這裏插入圖片描述
有同學可能會疑問,@RequestMapping 類上不是已經有了嗎爲什麼方法上還有,@RequestMapping 的作用域爲類或者方法,在 Controller 類上修飾的話標識該類的接口全部以 /api 爲前綴訪問,比如我們寫的這個方法的訪問地址就爲 /api/test1

那麼,@RequestBody又是什麼呢?@RequestBody 是SpringMVC爲我們提供的轉換註解,表示我們這個網址不是返回的一個頁面,而是返回的一個對象,SpringMVC 對標識了該註解的接口會自動將數據轉換爲 json
返回到頁面中,方便我們前端或者是移動端使用哦!

接下來,我們啓動服務訪問一下吧!

在這裏插入圖片描述
我們看到 瀏覽器已經響應了結果。

7. 第一次連接數據庫

上面的例子讓我們實現了接口返回數據,舉一反三你可以寫出很多複雜的接口,但是,沒有數據庫的支持,都是死數據,沒意思,對吧,廢話不多說,不搞 JDBC 不搞 hibernate ,直接上現代化 mybatis 框架

Spring 在之前集成 mybatis 相當複雜,需要配置很多的xml。在 SpringBoot 上集成 Mybatis 就變得簡單的多,直接在 pom.xml 中 添加依賴:

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.1</version>
</dependency>

以mysql爲例,當然,你想連接什麼數據庫僅需引入什麼數據庫的驅動依賴即可
第一個依賴是 mysql 的驅動依賴
第二個是 mybatis 提供的 SpringBoot starter 幫助我們快速配置並啓用 mybatis

首先需要創建一個數據庫名稱爲 dmyz (也就是我的個人公衆號 代碼宇宙的縮寫,歡迎大家關注~)我給大家準備了建表 SQL,執行即可生成 business 表和一條數據,方便大家快速測試,SQL 如下:

-- auto-generated definition
create table business_user
(
    id          int auto_increment comment '用戶id'
        primary key,
    username    varchar(255) default ''                not null comment '用戶名',
    password    varchar(255) default ''                not null comment '密碼',
    mobile      varchar(11)  default '0'               null comment '手機號',
    email       varchar(255) default ''                null comment '郵箱',
    create_time datetime     default CURRENT_TIMESTAMP not null comment '創建時間',
    update_time datetime     default CURRENT_TIMESTAMP not null comment '更新時間',
    status      int          default 0                 not null comment '狀態
0.正常
1.刪除',
    constraint business_user_username_uindex
        unique (username)
)
    comment '用戶基礎信息表';
create table business_user
(
    id          int auto_increment comment '用戶id'
        primary key,
    username    varchar(255) default ''                not null comment '用戶名',
    password    varchar(255) default ''                not null comment '密碼',
    mobile      varchar(11)  default '0'               null comment '手機號',
    email       varchar(255) default ''                null comment '郵箱',
    create_time datetime     default CURRENT_TIMESTAMP not null comment '創建時間',
    update_time datetime     default CURRENT_TIMESTAMP not null comment '更新時間',
    status      int          default 0                 not null comment '狀態
0.正常
1.刪除',
    constraint business_user_username_uindex
        unique (username)
)
    comment '用戶基礎信息表';

INSERT INTO ccloud.business_user (id, username, password, mobile, email, create_time, update_time, status) VALUES (1, '代碼宇宙', 'e6852b1bed61b9cbfbb6683ece03c8ee', '0', '', '2020-02-22 18:19:36', '2020-02-22 18:19:36', 0);

接下來配置數據庫連接,在 application.properties 中添加你的數據庫信息,如果你還不瞭解 mysql 或者 mybatis,建議學習下。

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dmyz
spring.datasource.username=root
spring.datasource.password=123456

然後按照下圖創建一個 Mapper注意圖上的 Mapper 註解)
在這裏插入圖片描述
這裏我們使用了註解 @Select 來簡化這個查詢,當然,也可以使用xml的方式來實現,這裏不做詳細介紹。

寫好了第一個Mapper 然後怎麼用它呢?和傳統 Spring 一樣,我們可以直接在 Controller 中注入這個 Mapper 來使用,如下圖:

在這裏插入圖片描述
這裏,說下,Spring 的注入方式有三種,一種是 @Resource 註解,一種是 @Autowired 註解,還有一種是構造函數注入,官方推薦推薦使用構造函數或者是@Resource 註解注入。

好了,下面啓動一下項目訪問 /api/test2 試試看吧!
你會看到如下圖所示的界面(你看到的可能沒有高亮,因爲我安裝了瀏覽器插件的原因)
在這裏插入圖片描述

7. 第一個攔截器

說完了接口,來說一下攔截器吧,攔截器在實際開發過程中非常常見,主要用於 權限驗證,接口過濾,參數驗證等等用途,下面就來實現一個簡單的攔截器。

比如說我們所有的接口,只允許攜帶 admin 密碼的人訪問,首先新建包 config,一般情況下 設計到配置的類我們都放在 config 包下以方便管理,攔截器代碼如下圖所示。

在這裏插入圖片描述
我們一步一步的解析,Spring 實現攔截器的辦法有兩種,一種是 HandlerInterceptor 一種是 FilterServlet 規範中的),我們選擇前者。

實現preHandle方法能對請求進行過濾,或者記錄日誌,我在這裏拿到了 admin參數並且驗證參數內容是否爲 代碼宇宙,如果是的話放行請求,如果不是的話就不予許訪問,返回 false,請求將會被中斷。

最後我們需要將我們的攔截器告訴 Spring,就需要集成 WebMvcConfigurationSupport 重寫 addInterceptors 並告訴攔截器我要添加一個攔截器,他要攔截的具體路徑是什麼。

至此,一個攔截器就實現完畢了!別忘了加 @Configuration 註解哦,這個註解是告訴Spring 這是一個 配置類,需要被加載的意思。

啓動程序,打開瀏覽器,訪問剛剛的接口 /api/test2 接口試驗一下吧

在這裏插入圖片描述
我們看到,內容已經消失了,因爲在攔截器中,獲取不到 admin 參數,返回了 false,導致請求終止,我們加上 admin 參數再試一下吧。

在這裏插入圖片描述

看!又恢復了正常。攔截器有很多的用途,細心揣摩將會發現攔截器不止一個 方法可以重寫,也不止可以獲取到 get 方式提價的參數,實現權限驗證其實很簡單,我們可以在攔截器中獲取到用戶的 cookie 或者 session 然後拿到用戶 id,去數據庫查詢到他的權限即可實現權限驗證或者登陸驗證。

這裏需要注意 : Springboot 默認是在org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 這個類配置默認的static 等路徑,但是這個類上面配置了@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
什麼意思呢?簡而言之就是說,如果發現了 WebMvcConfigurationSupport 類的存在,那麼這個配置將失效,我們在配置攔截器的時候,是配置了WebMvcConfigurationSupport類的。

在這裏插入圖片描述

那麼, 怎麼解決這個問題呢?很簡單,只需要在 攔截器中在重寫一個方法告訴 SpringBoot 那些目錄是靜態資源就OK 了

在這裏插入圖片描述

順便,還能將你的自定義目錄加進去,豈不美哉?
加完訪問試一下,記得加上 admin 參數,不然是訪問不通的哦~
在這裏插入圖片描述

4. 第一次部署到服務器

SpringBoot 由於其自帶容器,無需依賴外部容器,所以我們不需要將 項目打包成 war,直接打包成 jar 丟到服務器上運行即可,步驟如下:

首先使用 maven 對項目執行 package 操作,也就是打包

在這裏插入圖片描述
打包完畢後控制檯會輸出包的位置,這就是生成的 jar 包的位置

在這裏插入圖片描述

直接複製到服務器,運行命令java -jar demo-0.0.1-SNAPSHOT.jar即可啓動服務
但是這樣啓動僅僅是前臺運行,要是想後臺一直運行怎麼辦呢?nohup!

命令如下:

nohup java -jar demo-0.0.1-SNAPSHOT.jar &

5. 遇到問題怎麼辦?

俗話說,授人以魚不如授人以漁,與其我將你可能遇到的問題一一告訴你,不如告訴你如何去解決一遇到的問題,這樣一來,不管你遇到任何的問題,都能靠自己的能力去解決了!

打個比方,比如說剛剛我們配置完攔截器,去訪問之前的靜態頁面發現訪問不到了,首先這個問題,我們應該怎麼查怎麼想?

搜索:靜態資源訪問不到怎麼辦 X

這是錯誤的做法,這樣會查到很多的原因,導致很難解決實際的問題,正確的做法是

搜索:SpringBoot 攔截器 靜態資源訪問不到

首先包含了框架名稱,其次包含了前置事件,最後問題是什麼,這樣會讓我們快速定位問題所在,看下結果:

在這裏插入圖片描述
好了,到這裏,我想,你應該已經入門了,文章寫得很詳細,但難免有紕漏之處,遇到問題歡迎留言或者公衆號反饋給我,下集主要講進階,會首發於公衆號,謝謝!

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