国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

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

2021-08-04 09:46SegmentFault博客 Java教程

這篇文章主要介紹了Idea工具中創(chuàng)建 SpringBoot工程及入門分析詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

 

創(chuàng)建Module

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

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

填寫module信息,如圖所示:

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

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

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

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

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

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

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

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

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

 

啟動(dòng)入口

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

  1. package com.cy;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {//Application.class
  6. public static void main(String[] args) {//Main Thread
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

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

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

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

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

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

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

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

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

SpringBoot 快速入門分析

 

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

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

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

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

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

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

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

第一步:定義DefaultCache類

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

NoSuchBeanDefinition異常,如圖所示:

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

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

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

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

 

準(zhǔn)備工作

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

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

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

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

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

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

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

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

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

  1. package com.cy.pj.pool;
  2. import com.cy.pj.common.pool.ObjectPool;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6.  
  7. @SpringBootTest
  8. public class ObjectPoolTests {
  9.  
  10. @Autowired
  11. private ObjectPool objectPool01;
  12. @Autowired
  13. private ObjectPool objectPool02;
  14. @Test
  15. void testObjectPool01(){
  16. System.out.println(objectPool01==objectPool02);
  17. }
  18. }

延遲加載

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

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

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

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

對象作用域分析

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

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

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

對象生命周期方法

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

  1. package com.cy.pj.common.pool;
  2. @Scope("singleton")
  3. @Lazy
  4. @Component
  5. public class ObjectPool{//假設(shè)此對象為一個(gè)對象池
  6. public ObjectPool(){
  7. Systemd.out.println("ObjectPool()")
  8. }
  9. @PostConstruct
  10. public void init(){
  11. System.out.println("init()");
  12. }
  13. @PreDestroy
  14. public void destory(){
  15. System.out.println("destory()");
  16. }
  17. }

其中:

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

2)@PreDestroy 注解描述的方法為生命周期銷毀方法,此方法所在的對象,假如存儲(chǔ)到了spring容器,那這個(gè)對象在從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,如圖所示:

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

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

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

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

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

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

代碼編寫及測試分析

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

  1. package com.cy.pj.common.cache;
  2. public interface Cache {
  3.  
  4. }

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

  1. package com.cy.pj.common.cache;
  2.  
  3. @Component
  4. public class SoftCache implements Cache{
  5.  
  6. }

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

  1. package com.cy.pj.common.cache;
  2.  
  3. @Component
  4. public class WeakCache implements Cache{
  5.  
  6. }

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

  1. package com.cy.pj.common.cache;
  2. import org.junit.jupiter.api.Test;
  3.  
  4. @SpringBootTest
  5. public class CacheTests {
  6. @Autowired
  7. @Qualifier("softCache")
  8. private Cache cache;
  9.  
  10. @Test
  11. public void testCache() {
  12. System.out.println(cache);
  13. }
  14. }

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

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

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

 

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

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

總結(jié)(Summary)

 

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩av在线一区 | 精品在线一区 | 国产在线观看一区二区三区 | 成人免费crm在线观看 | 午夜精品一区二区三区在线视频 | 日韩高清不卡一区二区三区 | av在线一区二区三区 | 欧美精品一区二区在线观看 | 欧洲精品在线观看 | 成人片网址 | 国产一区二区三区在线视频 | 精品免费久久久久久久苍 | 国产精品亚洲成在人线 | 黄色精品一区二区 | 国产视频一区在线 | 国产精品69毛片高清亚洲 | 成人久久久久爱 | 国产免费黄色 | 日韩有码在线播放 | 天天澡天天狠天天天做 | 久久久亚洲国产美女国产盗摄 | 国内精品视频在线观看 | 在线视频一区二区三区 | 久久小视频 | a国产精品 | 91精品国产欧美一区二区 | 久久久精品视频免费观看 | 婷婷色综合 | 一本大道综合伊人精品热热 | 日韩在线一区二区三区免费视频 | 日韩av高清 | 欧美日韩精品综合 | 性农村人freesex | 久久这里有精品视频 | 久久久.com| 天天操天天操 | 亚洲 欧美 日韩在线 | 午夜av影院 | 日本丶国产丶欧美色综合 | 在线色网站 | 国产电影一区二区三区 |