(一) 初始 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 下看一下效果,運行成功了,瀏覽器也可以訪問
結尾
如果文章中有什麼不足,歡迎大家留言交流,感謝朋友們的支持!
如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公衆號
在這裏的我們素不相識,卻都在爲了自己的夢而努力 ❤
一個堅持推送原創開發技術文章的公衆號:理想二旬不止