Spring Boot(day02)

Spring底層工廠建立對象流程

在磁盤中有不少的Class文件,運行時要把磁盤中的文件讀到JVM的內存中(須要用到線程和I/O),系統底層會建立一個BeanDefinition對象用於存儲bean的配置信息,多個class文件就會建立多個BeanDefinition對象,這些對象存放在一個Map<String,BeanDefinition>集合中(包,註解....),經過工廠建立Bean Instance(Bean的實例)存儲在Map<String,Object>中,其中String中存儲的是名字,能夠在@Component註解中指定名字,如果不指定名字則類名首字母小寫爲默認名字,在構建Bean對象的時候,先查找Bean的配置信息,在找不到的時候就會報錯

image

SpringBoot項目加載流程

任何一個項目都有一個啓動入口,在springboot中的啓動類須要有@SpringBootApplication 註解進行描述,而且在列中會定義一個main方法,main方法在運行時會讀取配置文件,並加載指定資源,而後進行初始化操做

image

描述了DefaultCacheTests類與DefaultCache類的關係,這兩個類經過指定註解(@SpringBootTest,@Component)進行了描述,其意圖是告訴spring框架這個兩個類的實例的建立由Spring負責,而且由Spring框架基於@Autowired註解的描述完成DefaultCacheTests實例中有關DefaultCache類型的值的注入(DI)。

Spring Boot項目中配置文件來源

a)SpringBoot官方定義(通常爲一些基礎配置)例如  spring.factories(在SpringBoot自動配置依賴中) 
 b) 第三方定義(例如日誌系統-log4j.xml...)  
 c) 咱們本身定義(application.properties)

image.png

SpringBoot項目中的資源加載(資源能夠理解爲咱們的class文件)

a)JDK類文件    
b)Spring類文件 
c)本身定義的類文件  
JVM參數:-XX:+TraceClassLoading(跟蹤類加載)

image.png

JVM參數錄入路徑:類名右鍵Run As選擇Run Configurations
1.選擇Arguments
2.錄入在main方法中的形參(String[] arg)這裏面寫的就是arg中的值
3.將須要執行的JVM參數放入三種,點擊Run執行   
任意項目總體執行順序打開JDK包-->加載Object類-->加載Serializable(序列化)-->加載Comparable(比較類)-->加載CharSequence(字符序列)-->加載String(字符串類)

PS:當執行後沒有顯示出第一條數據時,能夠調整顯示的字符個數如圖所示調整控制檯輸出字符個數:
image.pngspring

SpringBoot中的項目資源初始化

a)構建實例對象
b)基於對象存儲數據(例如配置信息,默認值)

對象的兩種用法,一種是封裝數據,一種是業務流程(執行業務靠方法)

Spring Boot項目執行

SpringBoot項目大致分爲三個包

a)啓動包,在啓動包中添加代碼邏輯,並且執行類必定要在啓動包下或子包下
    b)配置包,將全部的配置信息文件寫在配置包中
    c)單元測試包,在單元測試包中寫入測試代碼,測試類必定要寫在單元測試包下或子包下

SpringBoot項目執行中的註解

@SpringBootApplication

任何一個項目都有一個啓動入口,在springboot中的啓動類須要有@SpringBootApplication 註解進行描述,而且在列中會定義一個main方法,main方法在運行時會讀取配置文件,並加載指定資源,而後進行初始化操做

@Component

將類使用spring框架中指定註解進行描述,例如@Component註解起的做用就是作標記

@SpringBootTest

@SpringBootTest註解是SpringBoot工程中的單元測試類須要使用此註解進行描述

@Test

單元測試類註解,與普通的測試類註解使用方法相同,要注意導包,SpringBoot項目中導入的@Test包爲org.junit.jupiter.api.Test
測試方法不能夠用private修飾也不能夠有返回值以及參數

is a

類實現了一個接口或是繼承了一個類是is a

has a

在某一類中有一個屬性是has a

use a

在某一個類中某個方法中使用了某個類是use a

SpringBoot業務經常使用註解

@Lazy

註解修飾的類就是告訴spring容器這個類在用不到的時候先不要建立能夠在後面添加值通常默認爲true(@Lazy(true),@Lazy(value=true))true/false就是設置註解是否延時加載

@Scope

@Scope("singleton")

沒有寫可是默認就是這個註解,默認爲單例做用域,這個類的實例在一個Spring容器中只能有一份,由於只有一份,因此在後來必定要考慮線程安全

@Scope("prototype")

每次從Spring容器中獲取對象都會建立一個新的實例,不會存儲在Spring的Bean池中

@PostConstruct

註解描述的方法會在**對象構建之後執行!!!**先執行對象的構造方法後再執行註解修飾的方法,用於執行一些初始化操做,好比在構建池的時候初始化池的參數、大小、鏈接超時時間......

@PreDestroy

註解描述的方法會在單例對象銷燬以前執行,Spring容器(Bean池)在銷燬以前會先將容器中的對象進行移除在移除對象時,假如對象中定義了生命週期銷燬方法,此時還會調用對象的生命週期銷燬方法(在這樣的方法中能夠作一席而資源釋放操做)

常見問題

在出現錯誤問題時首先要先找Cased by(緣由)
錯誤概述:
在spring容器中沒有Bean類型的定義。
image.png
出現這類問題的可能:
一、啓動類的包沒有放在指定的位置下,沒有在啓動包或啓動包的子包下
二、註解錯誤api

假如將此類交給Spring管理,請問spring什麼時候建立此對象?你怎麼知道的?

通常來講,在系統啓動的同時就建立對象,經過在類中準備構造函數,在運行項目的同時會執行構造方法中的代碼

假如一個對象建立之後,存儲到內存,長時間不用會有什麼影響?

會影響電腦速度,搶佔內存

你知道Spring中Bean對象的延遲加載特性嗎?(瞭解)

按需加載,對於佔用內存較多的對象,儘可能使用在有須要的時候在加載

對象建立之後,應用結束要銷燬對象嗎

Spring容器只能銷燬或是移除單例對象,多例對象不會存儲在Spring的Bean池中,多以不會銷燬或移除

Spring框架管理Bean對象有什麼優點嗎?

首先Spring爲你的Bean賦予了延遲加載、做用域、生命週期方法,基於這些特性能夠更加科學的使用對象,
相關文章
相關標籤/搜索