1. 程式人生 > 其它 >SpringBoot學習筆記(一)

SpringBoot學習筆記(一)

SpringBoot學習筆記(一)

暑期加入了沃天宇老師的實驗室進行暑期的實習。在正式開始工作之前,師兄先讓我瞭解一下技術棧,需要了解的有docker、k8s、springboot、springcloud。

謹以一系列部落格記錄一下自己學習的筆記。更多內容見Github

2021/7/12

因為我並非零基礎,之前有用過SpringBoot進行過很簡陋的專案開發,也仔細用過其它框架(ASP.NET),所以這次的學習過程主要是明確一些之前比較模糊的東西(包括Spring和SpringBoot),所以估計是一個一個小問題的實驗探究。

資料

Spring官網:https://spring.io/

簡單理解

spring整個框架最核心的就是IoC,在此基礎上提供了AOP、MVC等能力。

而springboot的出現,是為了能夠方便地構建和配置一個spring工程。

實驗一 生命週期

需要探索的問題:

  1. 短生命週期的Bean可以被注入到長生命週期的物件中嗎?
  2. 如果可以,會被重新注入嗎?
  3. 如果不可以,有什麼方法可以實現注入的效果呢?

實驗方法

構造一個擁有預設的單例生命週期Controller,往其中注入一個prototype的Proto物件和一個request生命週期的Req物件,如果沒有報錯,則說明短生命週期的Bean可以注入到長生命週期的物件中。

然後在Proto和Req物件的建構函式中,通過static變數生成一個唯一的id,通過列印id來判斷是否為同一個物件。

具體內容見:

exp1

實驗結果

測試結果如下:

Controller生命中週期 是否注入Proto 是否注入Req 能否成功啟動 工作情況
singleton ---
singleton 所有請求都使用的同一個Req
prototype 每次請求都會重新建立這三個物件
request 每次請求都會重新建立這三個物件

可見這似乎並不像ASP.NET那樣,IoC容器中有明確的生命週期長短singleton>scoped>transient,短生命週期的物件無法注入到長生命週期物件中。而是使用了其它的體系。

總的來說,被依賴的物件的生命週期應當長於注入的物件,比如request

的物件在請求結束之後應當失效,但是singleton卻會長久地持有它。而prototype的語義應當是每一次getBean時都應當返回一個新的物件,並不在乎其持續多久。

所以說,一個prototype被注入到singleton後,並不會在收到請求的時候再次被注入。

如果想要實現每一次請求都會注入新的例項的效果,有兩種方式:

  1. 在Controller的方法中加入引數,並且不要新增任何註解,或者新增@ModelAttribute,這樣,這個引數就會從BeanFactory例項化,但是這種方法如果是Service層需要的話,就需要從Controller一層層傳遞下去,不太優雅;
  2. 使用方法注入(Method Inject),建立一個形如:<public|protected> [abstract] <return-type> theMethodName(no-arguments);的抽象方法,並將其註冊為lookup方法(XML/註解均可),然後呼叫這個方法來手動建立例項。Spring會動態代理來建立這個抽象類的子類,這個子類會實現這個抽象方法:
@Lookup
protected abstract Req getReq();

參考: