01-01-CGB-SPRINGBOOT入門-01
1 Spring Boot 簡介
1.1 Spring Boot 概述
現在軟件市場已經形成一定的規模,系統架構的復雜度也越來越高(例如有單體架構,分布式架構,微服務架構)。軟件的整個架構體系正在發生很大變化,在這種變化中,企業現在更注重技術的開箱即用,更注重技術在生態圈中的深度融合,更注重輕量級的運維。由此spring boot誕生。
說明:學技術一定要了解技術發展史,并對技術的發展有一定的前瞻性。
1.2 Spring Boot 核心特性
Spring boot是一個腳手架,構建于Spring框架(Framework)基礎之上,基于快速構建理念,提供了自動配置功能,可實現其開箱即用特性(創建完一個基本的項目以后,可零配置或者少量配置即可運行我們的項目),其核心主要有如下幾個方面:
起步依賴(Starter Dependency)-項目創建時底層幫你關聯依賴。
自動配置(Auto Configuration)。
健康檢查(Actator)-監控。
其中,Spring Boot官方地址為https://spring.io/projects/spring-boot。
2 Spring Boot 環境配置
2.1 準備工作
工具下載
下載JDK1.8,并進行環境變量配置(假如已有則無需再次下載和配置)。
下載最新maven(例如apache-maven-3.6.3,網址http://maven.apache.org/)并解壓。
下載sts最新版(例如sts-4.4.5.RELEASE,網址https://spring.io/tools)并解壓(新版本下載下來時一個.jar文件,需要在jar文件所在的目錄中,以命令行方式執行java -jar 下載的文件名的方式進行解壓,如圖-1所示(需要首先啟動系統自帶的命令行客戶端,然后切換到軟件所在目錄,cd指令為切換目錄的意思)。
工作區準備:定義新的工作區(要求沒有中文目錄),例如d:/TCGBIII/WORKSPACE。
建議:將下載的所有文件存儲到同一目錄并解壓,例如d:/TCGBIII/TOOLS目錄。要求目錄不要有中文,也不要有特殊符號(例如&等)。
2.2 Maven基本配置
打開maven中的setting.xml文件,并對其如下選項進行配置。
配置maven本地庫(從maven遠程服務器下載的資源存儲到的位置)
${user.home}/.m5/repository
配置maven私服(配置到mirrors標簽內部)。
配置maven中的profile(配置到profiles標簽內部),設置JDK編譯和運行版本。
jdk-1.8 true 1.82.3 STS整合maven配置
啟動STS工具(特殊的eclipse,添加了spring開發插件),如圖-2所示
Maven Installations配置, 如圖-3所示:
Maven User Settings配置,如圖-4所示:
項目工作區編碼設置,如圖-5所示
2.4 STS工具使用基本優化(可選)
禁用拼寫檢查,取消圖-6所示的拼寫檢查選項。
取消圖-7所示的連接選項配置。
修改STS工具內存配置,打開SpringToolSuite4.ini文件,修改堆大小,如圖-9所示:
3 Spring Boot 快速入門
3.1 項目創建及結構分析
打開STS 集成開發工具,創建spring boot項目,其具體步驟如下:
第一步:打開項目新建窗口(快捷鍵ctrl+n), 搜索spring,選擇spring starter 項目。如圖-10所示:
在圖-12中點擊finish之后,項目便開始從maven配置中指定的私服服務器(例如阿里云的maven服務器)去下載起步依賴(SpringBoot項目中默認指定了項目啟動時需要的一些jar包依賴),這個過程可能會比較耗時(網絡最好不要用手機網絡,會導致很多資源下載不下來),假如指定版本的springboot項目以前創建過,它會默認先從本地庫查找,假如本地庫沒有,則從遠程庫去下載。
項目創建成功以后,其包視圖(Package Explorer)結構,如圖-13所示:
其中,在圖-13呈現的CGB-SBOOT-01項目結構中,所有的類和配置文件都是創建好項目以后,由STS工具幫我們自動創建的。(假如你是普通的maven項目,這些類還有配置文件需要我們自己手動創建)
3.2 項目啟動過程分析(了解)
找到項目的入口類(使用了@SpringBootApplication注解描述),然后運行啟動類,檢測啟動過程,SpringBoot在啟動時,控制臺會出現如圖-14標識:
。假如有,則將類交給Spring框架中的BeanFactory工廠接口的實現類對象,此工廠對象會基于反射創建Bean的實例,假如此Bean指定了生命周期方法,還會調用生命周期方法。當實例創建以后,Spring框架還會基于類的作用域描述,將實例存儲到不同作用域的容器中。以實現Bean對象的科學應用。
3.3 項目業務初步實現及測試
業務實現:
基于SpringBoot腳手架(或者架子工),通過Spring框架進行Bean對象的管理實現。
第一步:創建一個DefaultCache類,存儲到src/main/java目錄,然后交給spring管理。
package com.cy.pj.common.cache;
@Component
public class DefaultCache {}
其中,@Component是Spring中用于描述Bean類的一個注解。用于告訴Spring這個類的實例由Spring創建,當此對象由Spring創建和管理時,默認會將對象存儲到池(Bean池)中。
第二步:添加sringboot 測試類,進行bean的獲取及測試,要放在src/test/java目錄
中:
package com.cy.pj.common.cache;
@SpringBootTest
public class DefaultCacheTests {// is a Object
@Autowired
private DefaultCache defaultCache;//has a
@Test
public void testCache() {
//use a system
System.out.println(defaultCache);
}
}
其中:
@SpringBootTest 注解用于告訴spring框架,此測試類交給spring管理。
@Autowired注解描述屬性時,用于告訴spring框架要為此屬性注入一個值?(至于注入規則,后面課程慢慢加強)
第三步:代碼設計及運行分析,如圖-16所示:
在圖-16中描述了DefaultCacheTests類與DefaultCache類的關系,這兩個類通過指定注解(@SpringBootTest,@Component)進行了描述,其意圖是告訴spring框架這個兩個類的實例的創建由Spring負責,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests實例中有關DefaultCache類型的值的注入(DI)。
第四步:為對象設計作用域,設置延遲加載,設置生命周期方法(了解)。
在Spring框架中,Spring為由它創建和管理的對象,設計了一些特性,例如作用域,延遲加載,生命周期方法等,基于這些特性實現對Bean對象的管理。
package com.cy.pj.common.pool;
@Component
@Scope(“singleton”)
@Lazy
public class ObjectPool {
public ObjectPool() {
System.out.println(“ObjectPool()”);
}
@PostConstruct
public void init() {
System.out.println(“init()”);
}
@PreDestroy
public void destory() {
System.out.println(“destory”);
}
}
其中:
@Lazy注解用于描述類,其目的是告訴spring框架此類支持延遲加載,通常會配合單例作用域使用。
@Scope 是Spring中用于定義Bean對象作用域的一個注解,其常用的值有
singleton(整個內存有一份Bean實例,此實例何時創建與類的延遲加載特性配置有關,此實例創建以后,生命周期會由spring框架管理),prototype(每次獲取都會創建新實例,此實例會在需要時創建與lazy特性無關,這個實例創建以后,不會交給spring管理,spring可以對其初始化,但不負責銷毀。)等。
@PostConstruct 注解用于描述bean對象生命周期方法中的初始化方法,此方法會在對象的構造方法之后執行(是對象創建以后的初始化)。
@PreDestroy 注解用于描述Bean對象生命周期方法中的銷毀方法,此方法會在對象銷毀之前執行(當作用域為prototype時,此方法不會執行)。
第五步:通過測試類測試作用域,延遲加載,生命周期方法。
package com.cy.pj.common.cache;
@SpringBootTest
public class ObjectPoolTests {
@Autowired
private ObjectPool objectPool;
@Test
public void testObjectPool() {
//???
}
}
通過對上面小節的學習,能說說Spring框架管理Bean對象有什么優勢嗎?(面試)
Spring 是一個資源整合框架(Framework),通過spring可將很多資源(自己寫的對象或第三方提供的對象,例如連接池等)整合在一起,然后進行科學應用,以便更好的對外提供服務。如圖-17所示:
在圖-17中,Spring框架可以為由它管理的對象(Bean)提供懶加載策略(對象暫時用不到,則無需加載和實例化),作用域(例如singleton-頻繁用時可以考慮內存中只有一份,prototype-使用次數少時可以用時創建,不用時銷毀),生命周期方法(更好實現對象的初始化和資源銷毀),以實現對象對系統資源的有效使用。同時Spring框架還可以基于用戶設計管理對象與對象的依賴關系,以降低對象與對象之間的直接耦合,提高程序的可維護性和可擴展性。
3.4 項目業務增強實現及測試
假如一個接口的實現類的對象有多個,并且這些對象都交給了Spring管理,那么假如
另外一個類,現在依賴于這個接口,那么Spring如何為接口引入注入值?
第一步:定義業務Cache接口.
package com.cy.pj.common.cache;
public interface Cache {
}
第二步:定義WeakCache實現Cache接口.
第三步:package com.cy.pj.common.cache;
import org.springframework.stereotype.Component;
@Component
public class WeakCache implements Cache{
}
創建或修改SoftCache,讓此類也實現Cache接口,關鍵代碼如下:
package com.cy.pj.common.cache;
@Component
public class SoftCache implements Cache{
…
}
第四步:單元測試類
package com.cy.pj.common.cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CacheTests {
@Autowired
@Qualifier(“softCache”)
private Cache cache;
@Test
public void testCache() {
System.out.println(cache);
}
}
業務測試運行原理分析,如圖-18所示:
思考:
@Autowired注解應用規則?
@Qualifier注解的作用是什么?
@Autowired由spring框架定義,用于描述類中屬性或相關方法(例如構造方法)。Spring框架在項目運行時假如發現由他管理的Bean對象中有使用@Autowired注解描述的屬性或方法,可以按照指定規則為屬性賦值(DI)。其基本規則是:首先要檢測容器中是否有與屬性或方法參數類型相匹配的對象,假如有并且只有一個則直接注入。其次,假如檢測到有多個,還會按照@Autowired描述的屬性或方法參數名查找是否有名字匹配的對象,有則直接注入,沒有則拋出異常。最后,假如我們有明確要求,必須要注入類型為指定類型,名字為指定名字的對象還可以使用@Qualifier注解對其屬性或參數進行描述(此注解必須配合@Autowired注解使用)。具體過程可參考圖-18的設計進行自行嘗試和實踐。
4 Spring Boot 小節總結
4.1 重難點分析
Spring boot 是什么? (框架,也可以看成是框架腳手架,做了架子工要做的事情-搭建項目基礎骨架的工作人員)
Spring boot 核心優勢?(啟動依賴,自動配置-開箱即用,健康檢查-系統監控)
Spring boot 項目的創建方式?( https://start.spring.io)
Spring boot項目啟動時,Bean的初始化過程是怎樣的?(查找,加載,讀和存儲配置,創建和存儲實例對象)
Spring boot 項目啟動時,Bean對象的依賴注入過程是怎樣的?(標記,查找,注入)
Spring 框架中的Bean對象有什么特性?(延遲加載,作用域,生命周期方法)
Spring 框架中單例(singleton)作用域對象特點,應用場景(頻繁用)?
Spring 框架中多例(prototype)作用域對象特點,應用場景(稀少用)?
4.2 FAQ分析
Maven工具(項目構建工具)從哪里下載?(maven.apache.org)
STS(集成了spring插件的eclipse)工具從哪里下載?(spring.io/tools)
STS新版本怎么安裝?(例如STS4.5.0的安裝可使用:java -jar xxx.jar)
創建spring starter 項目時pom.xml文件錯誤?(maven私服,本地庫,maven update,網絡)
Spring Boot項目中支持的配置文件后綴有哪些?(.properties,.yml)
SpringBoot 啟動類的包掃描位置?(啟動類所在包以及子包)
SpringBoot項目中可以有多個啟動類嗎?(不可以)
如何理解Spring框架?(資源整合框架,科學應用對象-資源,低耦合)
Spring管理bean對象時有什么優勢?(為bean賦予了更加高級的特性,懶加載,單例作用域,生命周期方法)
Spring 框架中@Autowire注解描述屬性時,依賴注入的規則是怎樣的?
Spring 框架學習過程中學到了什么思想?(IOC,DI,池,低耦合,…)
Spring容器中bean名字不同,但類型相同的單例作用域配置可以有多個實例嗎?
4.3 BUG分析
Maven項目的setting文件配置錯誤,如圖-19所示:
問題分析:檢查maven目錄中的settings.xml的標簽語法配置是否正確.
創建項目時網絡連接超時,如圖-20所示:
問題分析:
1)域名解析問題(與當地的域名服務器有關)
2)網絡阻塞問題(帶寬有限,單同時的請求數量比較多)
3)服務器線程有限(例如tomcat端線程數量配置的相對較少)
Maven項目的pom.xml文件報錯,如圖-21所示:
問題分析:
檢查網絡配置(是否網絡暢通,不能手機網絡)
檢測maven配置是否正確(嚴格按文檔配置執行)。
右鍵項目maven update 強制更新。
更換maven私服倉庫(選文檔中的)
空指針異常(NullPointerException-NPE),如圖-22所示:
問題分析:分析錯誤描述,找到自己寫的類指定行號位置,看看哪個對象在進行方法調用,調用方法的對象有沒有被賦值。
依賴注入失敗,如圖-23所示:
問題分析:
檢查錯誤代碼中自己定義的類(例如DefaultCacheTests)中的屬性
基于錯誤分析,哪個屬性的值在進行依賴注入時失敗了(例如DefaultCache)
檢查注入失敗的屬性對應的對象是否交給了Spring管理(例如是否有特定注解描述,包結構是否正確)。
找不到對應的Bean對象,如圖-24所示:
問題分析:
檢查你獲取的這個對象實例的類型是否使用了特定注解描述(如@Component)
檢查你獲取的這個對象實例的類型所在的包是否正確(啟動類包結構)
假如是基于Bean的名字進行Bean對象的獲取,要檢測Bean的名字是否正確。
依賴注入失敗,如圖-25所示:
問題分析:
檢查哪里對Cache進行了引用。
檢查對Cache引用時使用的注解描述。
檢查容器中Cache接口下實現類對象的定義(是否有多個?)。
智能推薦
Hibernater入門-01
框架和CRM項目的整體介紹 什么是CRM CRM的模塊 模塊的具體功能 Hibernate框架的學習路線 Hibernate框架的概述 Hibernate框架的概述 什么是ORM(對象關系映射) Hibernate優點 Hibernate框架的快速入門 案例一:完成客戶的CRUD的操作 需求分析 第一步:下載Hibernate5的運行環境 第二步:創建表結構 第三步:搭建Hibernate的開發環...
XML入門01
XML:可擴展的標記語言 用來保存數據 可以用來做配置文件 數據傳輸載體 version:解析這個xml的時候,使用什么版本的解析器解析 encoding:解析xml中的文字的時候,使用什么編碼來編譯 standalone:no 該文檔會依賴關聯其他文檔;yes 這是一個獨立的文檔 幾個非法字符:< < > > &nbs...
01、Hibernate入門
一、hibernate是什么 1. 框架是什么? 1.框架是用來提高開發效率的 2.封裝了好了一些功能.我們需要使用這些功能時,調用即可.不需要再手動實現. 3.所以框架可以理解成是一個半成品的項目.只要懂得如何駕馭這些功能即可. 2.hibernate框架是什么 3.hibernate的好處 操作數據庫的時候,可以以面向對象的方式來完成.不需要書寫SQL語句 4.hibernate是一...
django入門01
1.首先安裝django 2.創建項目 從命令行cd到您要存儲代碼的目錄,然后運行以下命令: 文件解釋: 1.外部第一個myweb/ 根目錄只是一個項目的容器,是項目的主目錄文件,隨便命名 2.manage.py 一個命令行實用程序,可以讓運行該文件的方式與Django項目進行交互 3.內部的第二個myweb/目錄是項目的實際Python包,包括默認的幾個文件 myweb/init.py 一個空的...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...