Spring之IOC
簡介
首先,官網中有這樣一句話:Spring Framework implementation of the Inversion of Control (IoC) principle.這句話翻譯過來就是:Spring實現控制反轉(IOC)原理,由此可以得出,Inversion of Control(IOC)是一個名為控制反轉的原理,而Spring實現了他。而實現這個原理或者說設計原則的最常見的方式也是Spring框架使用的方式叫做依賴注入,也就是Dependency Injection(DI)。因此我們要講IOC實際上就是要講Spring是怎樣實現IOC和DI的,具體用什麼、怎樣去做的。
- 控制反轉:類的物件從建立到銷燬的整個流程都交給IOC容器去管理
- 依賴注入:我們透過幾種注入的方式將特定的bean注入到IOC容器中。
Bean
Bean是Spring實現IOC的一個重要的概念,官網是這樣說的:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
透過這句話我們能看出來,bean實際上就是被Spring IOC容器例項化、組裝、管理的物件。也就是說,建立並且管理物件的事兒不用我們去管了,這些都交由Spring框架的IOC容器去管理,這也就是控制反轉的思想,而bean就是我們注入的物件。而bean什麼時候去例項化將不會再寫死在程式中,也就是我們不需要將物件例項化,只需要用的時候去拿就行了,這種方式不僅讓我們不用再花心思管理物件,而且也能避免我們自己一些錯誤的例項化物件導致的記憶體問題。
Bean的生命週期
- 單例:當容器建立時建立物件,伴隨容器一直處於生存狀態,當容器被銷燬時物件才被銷燬
- 多例:當物件被使用時建立新的物件,伴隨物件的使用一直處於生存狀態,當物件在一定時間內不被使用時被GC回收掉
注入Bean的方式
- 建構函式注入:預設為無參構造,若為無參構造方式注入則需要類中必須存在有效的無參建構函式,不然會報異常
- Setter 方法注入:透過類中的Setter方法注入例項化物件
- 欄位注入:透過欄位名稱直接給欄位注入值,也可以直接注入Bean,此兩個Bean為引用關係
注入相關注解
- @Autowired:按照型別自動裝配物件,如果一個型別對應多個物件則可使用@Qualifier,@Qualifier的作用就是可以透過名稱自動裝配
- @Resource:該註解先透過名稱進行裝配,若沒有宣告name則根據類的型別進行裝配,順序與@Autowired相反
- @Bean:主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡,我們透過檢視@Bean的元註解可以看到,他只能作用在其他註解或者類的方法上,Bean預設的名稱為方法名,也可自定義名稱與別名
- @Component:用於標記類為Spring管理的元件的一種方式,透過該註解可以將普通的java類變成IOC容器中的一個Bean。該註解是一個泛型註解,可以用於標記任何型別的元件,他有幾個常用的、用於不同場景的子註解例如:@Repository,@Service,@Controller等
BeanFactory
BeanFactory是Spring IOC的本質,他的存在解決了bean的生產於管理,並且Spring還將bean的各個生命週期階段的管理介面暴露給我們,我們只需要實現這些介面那麼在bean的生命週期階段中,spring就會呼叫我們的介面實現去對bean做出相應處理。
Spring透過BeanDefinitionReader透過掃描我們專案中使用了@Component或者@Configuration註解的類,獲取到BeanDefintiions,將他們註冊到BeanFactory中。BeanFactory透過conCurrentHashMap儲存bean的資訊,key即為bean的名稱,Value就是BeanDefintiions,BeanDefintiions就是Bean的一些後設資料,比如類名、是否抽象等定義。
實現BeanFactory的實現類有多種,具體細節與取捨可以參考原始碼或者官方文件檢視
總結
到這裡我們其實對Spring IOC已經有了一個自己的理解,其實就是我們把類透過不同的方式注入到容器中,我們程式碼中只需要拿到這個bean然後去用就可以了,至於物件的生命週期都交給了我們的IOC容器去管理。
感謝各位大佬的光臨,Spring IOC的細節有很多,每一個點都可以拿出來單獨寫一篇部落格了,因此此篇部落格以較為精簡的介紹為主,想要探究更深層次的細節可以透過結合官方文件的介紹與原始碼去理解,好了不說廢話了,再次感謝各位大佬能看到這裡,如果該文章由任何問題歡迎各位大佬指出,謝謝