日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Idea工具中創建 SpringBoot工程及入門詳解

瀏覽:10日期:2023-03-25 18:36:15
SpringBoot 項目創建創建Module

基于IDEA創建項目Module,模塊名為04-springboot-start,組id和包名為com.cy,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

填寫module信息,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

選擇項目module版本,暫時不需要自己手動添加任何依賴,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

填寫Module名稱,完成module創建,如圖所示

Idea工具中創建 SpringBoot工程及入門詳解

項目結構分析

項目Module創建好以后,其代碼結構分析,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

SpringBoot 項目啟動分析啟動入口

SpringBoot 工程中由SpringBootApplication注解描述的類為啟動入口類,例如:

package com.cy;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {//Application.class public static void main(String[] args) {//Main Thread SpringApplication.run(Application.class, args); }}啟動過程概要分析

SpringBoot工程啟動時其簡易初始化過程,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

在啟動過程中底層做了哪些事情,大致描述如下:

1)基于配置加載類(通過ClassLoader將指定位置的類讀到內存->底層通過線程調用IO從磁盤讀取到內存)。

2)對類進行分析(創建字節碼對象-Class類型,通過反射獲取器配置信息)。

3)對于指定配置(例如由spring特定注解描述)的對象存儲其配置信息(借助BeanDefinition對象存儲)。

4)基于BeanDefinition對象中class的配置構建類的實例(Bean對象),并進行bean對象的管理(可能會存儲到bean池)。

SpringBoot 快速入門分析 業務描述

在項目Module中定義一個類,類名為DefaultCache,然后將此類對象交給Spring創建并管理。最后通過單元測試對類的實例進行分析。

API設計分析

基于業務描述,進行API及關系設計,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

代碼編寫及運行

基于業務及API設計,進行代碼編寫,其過程如下:

第一步:定義DefaultCache類

package com.cy.pj.common.cache;import org.springframework.stereotype.Component;/** * @Component 注解描述的類,表示此類交給Spring框架管理。 */@Componentpublic class DefaultCache {}

第二步:定義DefaultCacheTests單元測試類

package com.cy.pj.common.cache;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;@SpringBootTestpublic class DefaultCacheTests { /** * @Autowired 注解描述的屬性由spring框架按照一定規則為其注入值(賦值) * 賦值過程是怎樣的? * 1)依賴查找?(請問查找規則是什么?) * 2)依賴注入?(需要借助什么技術?) */ @Autowired private DefaultCache defaultCache; @Test void testDefaultCache(){ System.out.println(defaultCache.toString()); //FAQ? defaultCache變量引用的對象是由誰創建的,存儲 到了哪里?bean pool }}

第三步:運行單元測試類進行應用分析

啟動運行單元測試方法,檢測其輸出結果,基于結果分析:

1)SpringBoot項目中Bean對象的構建。

2)SpringBoot項目中Bean對象的獲取。

運行過程中的BUG分析

Bean類型找不到,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

空指針異常(NullPointerExcetpion-NPE),如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

啟動類找不到,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

啟動類有多個,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

NoSuchBeanDefinition異常,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

單元測試類中的方法添加了參數,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

SpringBoot 項目中的對象特性分析準備工作

第一步:創建項目Module,例如名字為05-springboot-features,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

第二步:添加業務類ObjectPool,代碼如下:

package com.cy.pj.common.pool;@Componentpublic class ObjectPool{//假設此對象為一個對象池 public ObjectPool(){//假設運行項目啟動類,此構造方法執行了,說明此類對象構建了。 Systemd.out.println('ObjectPool()') }}

思考:一般池對象有什么特點?

1)在JVM內存會開辟一塊相對比較大的空間。

2)在這塊空間中存儲一些對象(思考基于什么存儲結構進行存儲-數組,鏈表,散列表)。

3)基于“享元模式”設計思想,實現內存中對象的可重用性。

第三步:定義單元測試,代碼如下:

package com.cy.pj.pool;import com.cy.pj.common.pool.ObjectPool;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublic class ObjectPoolTests { @Autowired private ObjectPool objectPool01; @Autowired private ObjectPool objectPool02; @Test void testObjectPool01(){ System.out.println(objectPool01==objectPool02); }}延遲加載

現在思考一個問題,對于ObjectPool這個類,假如項目啟動以后,暫時不會用到這個池對象,是否有必要對其進行創建(默認是會創建的)?我們知道沒必要,因為占用內存。那如何在啟動時不創建此類對象呢?借助Spring框架提供的延遲加載特性進行實現。例如,我們可以在需要延遲加載的類上使用@Lazy注解進行描述,代碼如下:

package com.cy.pj.common.pool;@Lazy@Componentpublic class ObjectPool{//假設此對象為一個對象池 public ObjectPool(){//假設運行項目啟動類,此構造方法執行了,說明此類對象構建了。 Systemd.out.println('ObjectPool()') }}

此時,我們再去運行運行啟動類,檢測ObjectPool對象是否創建了,假如沒有創建,說明延遲加載生效了。此時,我們總結一下,什么對象適合使用延遲加載特性呢?大對象,稀少用(項目啟動以后,暫時用不到)的對象。

注意:延遲加載并不是延遲對類進行加載,而是在啟動時,暫時不創建類的實例。假如想看一下內存中的類是否被加載了,可以通過JVM參數進行檢測,參數為-XX:+TraceClassLoading。

對象作用域分析

在實際的項目中內存中的對象有一些可能要反復應用很多次,有一些可能用完以后再也不用了或者說應用次數很少了。對于經常要重復使用的對象我可考慮存儲到池中(例如交給spring框架進行管理),應用次數很少的對象那就沒必要放到池中了,用完以后讓它自己銷毀就可以了。在Spring項目工程中為了對這樣的對象進行設計和管理,提供了作用域特性的支持,具體應用:

package com.cy.pj.common.pool;@Scope('singleton')@Lazy@Componentpublic class ObjectPool{//假設此對象為一個對象池 public ObjectPool(){//假設運行項目啟動類,此構造方法執行了,說明此類對象構建了。 Systemd.out.println('ObjectPool()') }}

其中,在上面的代碼中,我們使用了@Scope注解對類進行描述,用于指定類的實例作用域。不寫@Scope默認就是單例(singleton)作用域,這個作用域會配合延遲加載(@Lazy)特性使用,表示此類的實例在需要時可以創建一份并且將其存儲到spring的容器中(Bean池),需要的時候從池中取,以實現對象的可重用。假如一些對象應用次數非常少,可以考慮不放入池中,進而使用@Scope('prototype')作用域對類進行描述,讓此類的對象何時需要何時創建,用完以后,當此對象不可達了,則可以直接被GC系統銷毀。

對象生命周期方法

程序中的每個對象都有生命周期,對象創建,初始化,應用,銷毀的這個過程稱之為對象的生命周期。在對象創建以后要初始化,應用完成以后要銷毀時執行的一些方法,我們可以稱之為生命周期方法。但不見得每個對象都會定義生命周期方法。在實際項目中往往一些池對象通常會定義這樣的一些生命周期方法(例如連接池)。那這樣的方法在spring工程中如何進行標識呢?通常要借助@PostConstruct和@PreDestroy注解對特定方法進行描述,例如:

package com.cy.pj.common.pool;@Scope('singleton')@Lazy@Componentpublic class ObjectPool{//假設此對象為一個對象池 public ObjectPool(){ Systemd.out.println('ObjectPool()') } @PostConstruct public void init(){ System.out.println('init()'); } @PreDestroy public void destory(){ System.out.println('destory()'); }}

其中:

1)@PostConstruct 注解描述的方法為生命周期初始化方法,在對象構建以后執行.

2)@PreDestroy 注解描述的方法為生命周期銷毀方法,此方法所在的對象,假如存儲到了spring容器,那這個對象在從spring容器移除之前會先執行這個生命周期銷毀方法(prototype作用域對象不執行此方法).

SpringBoot 項目中的依賴注入過程分析

在SpringBoot工程中,假如類與類之間存在著一定的依賴關系,Spring是如何進行依賴注入的呢,現在我們就通過一個案例做一個分析。

準備工作

第一步:創建一個項目module,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

第二步:啟動運行項目,檢測是否能成功啟動

案例設計及分析

為了更好理解spring框架的底層注入機制,現在進行案例API設計,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

在這個案例中單元測試類CacheTests中定義一個Cache接口類型的屬性,然后由Spring框架完成對cache類型屬性值的注入。

代碼編寫及測試分析

第一步:定義Cache接口,代碼如下:

package com.cy.pj.common.cache;public interface Cache { }

第二步:定義Cache接口實現類SoftCache,代碼如下:

package com.cy.pj.common.cache; @Componentpublic class SoftCache implements Cache{}

第三步:定義Cache接口實現類WeakCache,代碼如下:

package com.cy.pj.common.cache; @Componentpublic class WeakCache implements Cache{}

第四步:定義CacheTests單元測試類,代碼如下:

package com.cy.pj.common.cache;import org.junit.jupiter.api.Test;@SpringBootTest public class CacheTests { @Autowired @Qualifier('softCache') private Cache cache; @Test public void testCache() { System.out.println(cache); }}

其中,@Autowired由spring框架定義,用于描述類中屬性或相關方法(例如構造方法)。Spring框架在項目運行時假如發現由他管理的Bean對象中有使用@Autowired注解描述的屬性或方法,可以按照指定規則為屬性賦值(DI)。其基本規則是:首先要檢測容器中是否有與屬性或方法參數類型相匹配的對象,假如有并且只有一個則直接注入。其次,假如檢測到有多個,還會按照@Autowired描述的屬性或方法參數名查找是否有名字匹配的對象,有則直接注入,沒有則拋出異常。最后,假如我們有明確要求,必須要注入類型為指定類型,名字為指定名字的對象還可以使用@Qualifier注解對其屬性或參數進行描述(此注解必須配合@Autowired注解使用)。

第五步:運行CacheTests檢測輸出結果,基于結果理解其注入規則。

編寫及測試過程中的BUG分析

依賴注入異常,如圖所示:

Idea工具中創建 SpringBoot工程及入門詳解

總結(Summary)

本小節為springboot技術入門章節,主要講述了SpringBoot工程下,spring中bean對象的編寫,特性以及依賴注入的規則,希望通過這一小節的講解,同學們能夠理解我們為什么要將對象交給spring管理,spring管理對象有什么優勢,我們在springboot工程中應該如何配置這些對象。

到此這篇關于Idea工具中創建 SpringBoot工程及入門分析詳解的文章就介紹到這了,更多相關idea創建 SpringBoot工程內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
丝袜诱惑制服诱惑色一区在线观看| 久久av国产紧身裤| 日韩av三区| 免费看欧美美女黄的网站| 欧美日韩国产传媒| 欧美日韩精品免费观看视频完整| 久久免费国产| 婷婷亚洲五月| 久久一区二区三区电影| 成人免费电影网址| 亚洲v在线看| 国产精品88久久久久久| 国产视频欧美| 亚洲区国产区| 欧美在线黄色| 久久不见久久见免费视频7| 国产精品一区二区三区av麻| 欧美久久一区二区三区| 国产日韩一区二区三免费高清| 日韩avvvv在线播放| 日韩1区2区日韩1区2区| 香蕉成人av| 日韩va亚洲va欧美va久久| 久久人人97超碰国产公开结果| 日韩久久视频| 日韩欧美一区二区三区在线观看| 国产99久久| 国产精品丝袜xxxxxxx| 六月丁香综合| 日韩精品一区二区三区中文在线| 欧美伊人影院| 九九久久国产| 国产一区二区三区久久| 成人日韩在线| 激情欧美亚洲| 99在线精品视频在线观看| 综合亚洲色图| 国产精品777777在线播放| 久久精品三级| 久久国产影院| 视频在线观看91| 国产精品中文字幕亚洲欧美 | 夜夜精品视频| 色狠狠一区二区三区| 国产精品一区二区免费福利视频| 国产高清亚洲| 91精品久久久久久久久久不卡| 国产偷自视频区视频一区二区| 亚洲日本在线观看视频| 免费一区二区三区在线视频| 国产精选在线| 妖精视频成人观看www| 欧美激情精品| 欧美 日韩 国产一区二区在线视频| 在线免费观看亚洲| 国产精品日本一区二区不卡视频| 在线看片国产福利你懂的| 国产麻豆综合| 欧美a级一区二区| 国产99久久久国产精品成人免费| 欧美日韩国产在线观看网站| 日本99精品| 久久久国产亚洲精品| 日韩免费精品| 日韩av首页| 日本三级亚洲精品| 久久精品国产99久久| 日本在线一区二区三区| 91综合网人人| 日韩国产在线观看| 91精品蜜臀一区二区三区在线| 日韩动漫一区| 亚洲福利一区| 久久99久久久精品欧美| 国产精品av久久久久久麻豆网| 日韩精选在线| 在线看片不卡| 日韩av二区| 欧美日韩视频免费看| 黄色在线一区| 色综合狠狠操| 国产乱码精品一区二区亚洲| 亚洲一区二区三区高清| 国产网站在线| 美腿丝袜在线亚洲一区| 亚洲精品护士| 国产精品88久久久久久| 91亚洲成人| 国产精品一区二区三区美女| 免费在线观看日韩欧美| 欧洲av不卡| 久久免费精品| 国产日韩精品视频一区二区三区| 香蕉视频成人在线观看| 国产精品久久久久蜜臀| 视频精品一区| 狠狠色狠狠色综合日日tαg| 蜜桃成人精品| 国产精品网址| 日本久久二区| 欧美日韩四区| 精品国产91| 亚洲欧洲国产精品一区| 日韩欧美一区二区三区免费看| 日韩欧美四区| 麻豆一区二区在线| 国产欧美三级| 午夜亚洲福利在线老司机| 精品久久91| 日本视频一区二区| 欧美日韩少妇| 日韩中文在线电影| 国产精品久久久久久久久久妞妞| 99国产精品视频免费观看一公开| 丰满少妇一区| 国产亚洲高清在线观看| 国产精品婷婷| 婷婷成人在线| 精品一区av| 欧美日一区二区在线观看| 亚洲二区免费| 色综合五月天| 国产精品日韩精品中文字幕| 激情欧美一区| 国产高清久久| 亚洲精品一级二级| 国产在线不卡一区二区三区 | 亚洲福利免费| 久久亚洲精品中文字幕蜜潮电影| 精品三级av| 国产精品夜夜夜| 亚洲精品影视| 日韩av午夜在线观看| 精品成人免费一区二区在线播放| 日本色综合中文字幕| 日韩影院精彩在线| 伊人久久婷婷| 日韩精品看片| 日韩国产一区二区三区| 色综合狠狠操| 欧美国产不卡| 亚洲综合在线电影| 超碰在线99| 国产成人久久| 久久这里只有| 久久精品系列| 国产精一区二区| 97国产精品| 精品久久电影| 国产精品久久久久久久久妇女| 精品99久久| 中文字幕色婷婷在线视频| 国产夫妻在线| 免费观看不卡av| 黄色成人精品网站| 久久电影一区| 亚洲三级毛片| 日本午夜精品视频在线观看| 日韩高清二区| 日韩二区在线观看| 韩日一区二区| 欧美日韩免费看片| 伊人久久大香线蕉av不卡| 久久理论电影| 99香蕉国产精品偷在线观看| 中文精品在线| 国产精品一区二区美女视频免费看| 奇米亚洲欧美| 免费在线成人| 日韩专区精品| 五月天久久久| 亚洲网址在线观看| 免费日韩一区二区三区| 成人免费一区| 91精品精品| 蜜芽一区二区三区| 欧美一区二区三区免费看| 久久超碰99| 91精品久久久久久久久久不卡| 欧美在线亚洲| 日本精品在线播放| 精品国产不卡| 在线一区av| 最新亚洲国产| 国产午夜一区| 国产精品久久久久久久久妇女| 久久精品免费一区二区三区| 亚洲一区日本| 国产精品日本一区二区三区在线| 美女视频黄 久久| 午夜日韩av| 97精品久久| 亚洲深夜视频| 中文欧美日韩| 69精品国产久热在线观看| 国产精品一区二区99| 欧美.日韩.国产.一区.二区| 亚洲精品日韩久久| 成人亚洲一区二区| 亚洲欧洲午夜|