SpringBoot學習筆記(一)
阿新 • • 發佈:2021-07-13
SpringBoot學習筆記(一)
暑期加入了沃天宇老師的實驗室進行暑期的實習。在正式開始工作之前,師兄先讓我瞭解一下技術棧,需要了解的有docker、k8s、springboot、springcloud。
謹以一系列部落格記錄一下自己學習的筆記。更多內容見Github
2021/7/12
因為我並非零基礎,之前有用過SpringBoot進行過很簡陋的專案開發,也仔細用過其它框架(ASP.NET),所以這次的學習過程主要是明確一些之前比較模糊的東西(包括Spring和SpringBoot),所以估計是一個一個小問題的實驗探究。
資料
Spring官網:https://spring.io/
簡單理解
spring整個框架最核心的就是IoC,在此基礎上提供了AOP、MVC等能力。
而springboot的出現,是為了能夠方便地構建和配置一個spring工程。
實驗一 生命週期
需要探索的問題:
- 短生命週期的Bean可以被注入到長生命週期的物件中嗎?
- 如果可以,會被重新注入嗎?
- 如果不可以,有什麼方法可以實現注入的效果呢?
實驗方法
構造一個擁有預設的單例生命週期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
後,並不會在收到請求的時候再次被注入。
如果想要實現每一次請求都會注入新的例項的效果,有兩種方式:
- 在Controller的方法中加入引數,並且不要新增任何註解,或者新增
@ModelAttribute
,這樣,這個引數就會從BeanFactory例項化,但是這種方法如果是Service層需要的話,就需要從Controller一層層傳遞下去,不太優雅; - 使用
方法注入
(Method Inject),建立一個形如:<public|protected> [abstract] <return-type> theMethodName(no-arguments);
的抽象方法,並將其註冊為lookup
方法(XML/註解均可),然後呼叫這個方法來手動建立例項。Spring會動態代理來建立這個抽象類的子類,這個子類會實現這個抽象方法:
@Lookup
protected abstract Req getReq();
參考: