最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

 更新時(shí)間:2021年02月04日 10:41:32   作者:SegmentFault博客  
這篇文章主要介紹了Idea工具中創(chuàng)建 SpringBoot工程及入門分析詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

SpringBoot 項(xiàng)目創(chuàng)建

創(chuàng)建Module

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

填寫module信息,如圖所示:

選擇項(xiàng)目module版本,暫時(shí)不需要自己手動(dòng)添加任何依賴,如圖所示:

填寫Module名稱,完成module創(chuàng)建,如圖所示

項(xiàng)目結(jié)構(gòu)分析

項(xiàng)目Module創(chuàng)建好以后,其代碼結(jié)構(gòu)分析,如圖所示:

SpringBoot 項(xiàng)目啟動(dòng)分析

啟動(dòng)入口

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

package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {//Application.class
 public static void main(String[] args) {//Main Thread
 SpringApplication.run(Application.class, args);
 }
}

啟動(dòng)過程概要分析

SpringBoot工程啟動(dòng)時(shí)其簡易初始化過程,如圖所示:

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

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

2)對(duì)類進(jìn)行分析(創(chuàng)建字節(jié)碼對(duì)象-Class類型,通過反射獲取器配置信息)。

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

4)基于BeanDefinition對(duì)象中class的配置構(gòu)建類的實(shí)例(Bean對(duì)象),并進(jìn)行bean對(duì)象的管理(可能會(huì)存儲(chǔ)到bean池)。

SpringBoot 快速入門分析

 業(yè)務(wù)描述

在項(xiàng)目Module中定義一個(gè)類,類名為DefaultCache,然后將此類對(duì)象交給Spring創(chuàng)建并管理。最后通過單元測試對(duì)類的實(shí)例進(jìn)行分析。

API設(shè)計(jì)分析

基于業(yè)務(wù)描述,進(jìn)行API及關(guān)系設(shè)計(jì),如圖所示:

 

代碼編寫及運(yùn)行

基于業(yè)務(wù)及API設(shè)計(jì),進(jìn)行代碼編寫,其過程如下:

第一步:定義DefaultCache類

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

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

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

第三步:運(yùn)行單元測試類進(jìn)行應(yīng)用分析

啟動(dòng)運(yùn)行單元測試方法,檢測其輸出結(jié)果,基于結(jié)果分析:

1)SpringBoot項(xiàng)目中Bean對(duì)象的構(gòu)建。

2)SpringBoot項(xiàng)目中Bean對(duì)象的獲取。

運(yùn)行過程中的BUG分析

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

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

啟動(dòng)類找不到,如圖所示:

啟動(dòng)類有多個(gè),如圖所示:

NoSuchBeanDefinition異常,如圖所示:

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

SpringBoot 項(xiàng)目中的對(duì)象特性分析

準(zhǔn)備工作

第一步:創(chuàng)建項(xiàng)目Module,例如名字為05-springboot-features,如圖所示:

 

第二步:添加業(yè)務(wù)類ObjectPool,代碼如下:

package com.cy.pj.common.pool;
@Component
public class ObjectPool{//假設(shè)此對(duì)象為一個(gè)對(duì)象池
 public ObjectPool(){//假設(shè)運(yùn)行項(xiàng)目啟動(dòng)類,此構(gòu)造方法執(zhí)行了,說明此類對(duì)象構(gòu)建了。
 Systemd.out.println("ObjectPool()")
 }
}

思考:一般池對(duì)象有什么特點(diǎn)?

1)在JVM內(nèi)存會(huì)開辟一塊相對(duì)比較大的空間。

2)在這塊空間中存儲(chǔ)一些對(duì)象(思考基于什么存儲(chǔ)結(jié)構(gòu)進(jìn)行存儲(chǔ)-數(shù)組,鏈表,散列表)。

3)基于“享元模式”設(shè)計(jì)思想,實(shí)現(xiàn)內(nèi)存中對(duì)象的可重用性。

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

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;

@SpringBootTest
public class ObjectPoolTests {

 @Autowired
 private ObjectPool objectPool01;
 @Autowired
 private ObjectPool objectPool02;
 @Test
 void testObjectPool01(){
 System.out.println(objectPool01==objectPool02);
 }
}

延遲加載

現(xiàn)在思考一個(gè)問題,對(duì)于ObjectPool這個(gè)類,假如項(xiàng)目啟動(dòng)以后,暫時(shí)不會(huì)用到這個(gè)池對(duì)象,是否有必要對(duì)其進(jìn)行創(chuàng)建(默認(rèn)是會(huì)創(chuàng)建的)?我們知道沒必要,因?yàn)檎加脙?nèi)存。那如何在啟動(dòng)時(shí)不創(chuàng)建此類對(duì)象呢?借助Spring框架提供的延遲加載特性進(jìn)行實(shí)現(xiàn)。例如,我們可以在需要延遲加載的類上使用@Lazy注解進(jìn)行描述,代碼如下:

package com.cy.pj.common.pool;
@Lazy
@Component
public class ObjectPool{//假設(shè)此對(duì)象為一個(gè)對(duì)象池
 public ObjectPool(){//假設(shè)運(yùn)行項(xiàng)目啟動(dòng)類,此構(gòu)造方法執(zhí)行了,說明此類對(duì)象構(gòu)建了。
 Systemd.out.println("ObjectPool()")
 }
}

此時(shí),我們?cè)偃ミ\(yùn)行運(yùn)行啟動(dòng)類,檢測ObjectPool對(duì)象是否創(chuàng)建了,假如沒有創(chuàng)建,說明延遲加載生效了。此時(shí),我們總結(jié)一下,什么對(duì)象適合使用延遲加載特性呢?大對(duì)象,稀少用(項(xiàng)目啟動(dòng)以后,暫時(shí)用不到)的對(duì)象。

注意:延遲加載并不是延遲對(duì)類進(jìn)行加載,而是在啟動(dòng)時(shí),暫時(shí)不創(chuàng)建類的實(shí)例。假如想看一下內(nèi)存中的類是否被加載了,可以通過JVM參數(shù)進(jìn)行檢測,參數(shù)為-XX:+TraceClassLoading。

對(duì)象作用域分析

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

package com.cy.pj.common.pool;
@Scope("singleton")
@Lazy
@Component
public class ObjectPool{//假設(shè)此對(duì)象為一個(gè)對(duì)象池
 public ObjectPool(){//假設(shè)運(yùn)行項(xiàng)目啟動(dòng)類,此構(gòu)造方法執(zhí)行了,說明此類對(duì)象構(gòu)建了。
 Systemd.out.println("ObjectPool()")
 }
}

其中,在上面的代碼中,我們使用了@Scope注解對(duì)類進(jìn)行描述,用于指定類的實(shí)例作用域。不寫@Scope默認(rèn)就是單例(singleton)作用域,這個(gè)作用域會(huì)配合延遲加載(@Lazy)特性使用,表示此類的實(shí)例在需要時(shí)可以創(chuàng)建一份并且將其存儲(chǔ)到spring的容器中(Bean池),需要的時(shí)候從池中取,以實(shí)現(xiàn)對(duì)象的可重用。假如一些對(duì)象應(yīng)用次數(shù)非常少,可以考慮不放入池中,進(jìn)而使用@Scope("prototype")作用域?qū)︻愡M(jìn)行描述,讓此類的對(duì)象何時(shí)需要何時(shí)創(chuàng)建,用完以后,當(dāng)此對(duì)象不可達(dá)了,則可以直接被GC系統(tǒng)銷毀。

對(duì)象生命周期方法

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

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

其中:

1)@PostConstruct 注解描述的方法為生命周期初始化方法,在對(duì)象構(gòu)建以后執(zhí)行.

2)@PreDestroy 注解描述的方法為生命周期銷毀方法,此方法所在的對(duì)象,假如存儲(chǔ)到了spring容器,那這個(gè)對(duì)象在從spring容器移除之前會(huì)先執(zhí)行這個(gè)生命周期銷毀方法(prototype作用域?qū)ο蟛粓?zhí)行此方法).

SpringBoot 項(xiàng)目中的依賴注入過程分析

在SpringBoot工程中,假如類與類之間存在著一定的依賴關(guān)系,Spring是如何進(jìn)行依賴注入的呢,現(xiàn)在我們就通過一個(gè)案例做一個(gè)分析。

準(zhǔn)備工作

第一步:創(chuàng)建一個(gè)項(xiàng)目module,如圖所示:

第二步:啟動(dòng)運(yùn)行項(xiàng)目,檢測是否能成功啟動(dòng)

案例設(shè)計(jì)及分析

為了更好理解spring框架的底層注入機(jī)制,現(xiàn)在進(jìn)行案例API設(shè)計(jì),如圖所示:

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

代碼編寫及測試分析

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

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

第二步:定義Cache接口實(shí)現(xiàn)類SoftCache,代碼如下:

package com.cy.pj.common.cache;
 
@Component
public class SoftCache implements Cache{

}

第三步:定義Cache接口實(shí)現(xiàn)類WeakCache,代碼如下:

package com.cy.pj.common.cache;
 
@Component
public 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框架定義,用于描述類中屬性或相關(guān)方法(例如構(gòu)造方法)。Spring框架在項(xiàng)目運(yùn)行時(shí)假如發(fā)現(xiàn)由他管理的Bean對(duì)象中有使用@Autowired注解描述的屬性或方法,可以按照指定規(guī)則為屬性賦值(DI)。其基本規(guī)則是:首先要檢測容器中是否有與屬性或方法參數(shù)類型相匹配的對(duì)象,假如有并且只有一個(gè)則直接注入。其次,假如檢測到有多個(gè),還會(huì)按照@Autowired描述的屬性或方法參數(shù)名查找是否有名字匹配的對(duì)象,有則直接注入,沒有則拋出異常。最后,假如我們有明確要求,必須要注入類型為指定類型,名字為指定名字的對(duì)象還可以使用@Qualifier注解對(duì)其屬性或參數(shù)進(jìn)行描述(此注解必須配合@Autowired注解使用)。

第五步:運(yùn)行CacheTests檢測輸出結(jié)果,基于結(jié)果理解其注入規(guī)則。

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

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

總結(jié)(Summary)

本小節(jié)為springboot技術(shù)入門章節(jié),主要講述了SpringBoot工程下,spring中bean對(duì)象的編寫,特性以及依賴注入的規(guī)則,希望通過這一小節(jié)的講解,同學(xué)們能夠理解我們?yōu)槭裁匆獙?duì)象交給spring管理,spring管理對(duì)象有什么優(yōu)勢,我們?cè)趕pringboot工程中應(yīng)該如何配置這些對(duì)象。

到此這篇關(guān)于Idea工具中創(chuàng)建 SpringBoot工程及入門分析詳解的文章就介紹到這了,更多相關(guān)idea創(chuàng)建 SpringBoot工程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)馬踏棋盤的完整版

    java實(shí)現(xiàn)馬踏棋盤的完整版

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)馬踏棋盤的完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringBoot使用validation-api實(shí)現(xiàn)對(duì)枚舉類參數(shù)校驗(yàn)的方法

    SpringBoot使用validation-api實(shí)現(xiàn)對(duì)枚舉類參數(shù)校驗(yàn)的方法

    這篇文章主要介紹了SpringBoot使用validation-api實(shí)現(xiàn)對(duì)枚舉類參數(shù)校驗(yàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫

    Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫

    這篇文章主要介紹了Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫,本文通過例子逐步介紹了java如何操作IO流,和文字解析,需要的朋友可以參考下
    2021-07-07
  • spring-boot react如何一步一步實(shí)現(xiàn)增刪改查

    spring-boot react如何一步一步實(shí)現(xiàn)增刪改查

    這篇文章主要介紹了spring-boot react如何一步一步實(shí)現(xiàn)增刪改查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • MyBatis一對(duì)一映射初識(shí)教程

    MyBatis一對(duì)一映射初識(shí)教程

    MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。在我們生活中一對(duì)一的例子很多見,下面通過本文給大家?guī)砹薽ybatis一對(duì)一映射初識(shí)教程,感興趣的朋友一起看下吧
    2016-08-08
  • springCloud項(xiàng)目搭建流程步驟分解

    springCloud項(xiàng)目搭建流程步驟分解

    SpringCloud 作為當(dāng)下最為流行的微服務(wù)框架,也越來越多的人去學(xué)習(xí)和使用這個(gè)框架。下面,我將帶大家簡單地認(rèn)識(shí)一下 SpringCloud 框架,以及如何來搭建一個(gè) SpringCloud 項(xiàng)目環(huán)境的教程
    2022-05-05
  • java多線程有序讀取同一個(gè)文件

    java多線程有序讀取同一個(gè)文件

    這篇文章主要為大家詳細(xì)介紹了java多線程有序讀取同一個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java實(shí)現(xiàn)經(jīng)典大富翁游戲的示例詳解

    Java實(shí)現(xiàn)經(jīng)典大富翁游戲的示例詳解

    大富翁,又名地產(chǎn)大亨。是一種多人策略圖版游戲。參與者分得游戲金錢,憑運(yùn)氣(擲骰子)及交易策略,買地、建樓以賺取租金。本文將通過Java實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02
  • Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息

    Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息

    最近在開發(fā)中需要從request中獲取操作系統(tǒng),瀏覽器及瀏覽器版本信息,所以下面這篇文章主要給的大家介紹了關(guān)于Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Java虛擬機(jī)JVM棧溢出的問題解決

    Java虛擬機(jī)JVM棧溢出的問題解決

    Java虛擬機(jī)棧溢出是指在Java程序中,當(dāng)線程調(diào)用的方法層級(jí)過深,導(dǎo)致??臻g溢出的情況,本文就詳細(xì)的介紹了下產(chǎn)生的原因以及優(yōu)化,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08

最新評(píng)論

赫章县| 阿巴嘎旗| 庆阳市| 五大连池市| 衡阳县| 浪卡子县| 定结县| 册亨县| 梁山县| 辽宁省| 宝应县| 曲周县| 瑞昌市| 大关县| 方正县| 延川县| 抚顺县| 万源市| 嵊泗县| 大埔县| 竹北市| 丰原市| 密云县| 林西县| 交城县| 广平县| 深泽县| 丘北县| 永州市| 美姑县| 闵行区| 太白县| 夏津县| 外汇| 苗栗县| 丁青县| 灵宝市| 军事| 会同县| 晋州市| 临高县|