一、什麼是Spring框架中的三級緩存
Spring框架中的三級緩存指的是“單例對象池”,它是Spring框架中對單例對象進行緩存的機制,可以提高應用程序的性能。它包含了三個緩存層次:
- singletonObjects:緩存已經實例化的單例對象。
- earlySingletonObjects:緩存正在創建中的單例對象,這些對象對應的bean還未執行完構造函數、初始化方法等操作。
- singletonFactories:緩存的是ObjectFactory類型的對象。對於“原型範圍”的Bean實例,為了保證每次都能新建一個,只能使用對象工廠進行Bean的初始化。
三層緩存按照優先級逐漸降低。
下面我們將深入理解三級緩存的運作機制。
二、Spring框架三級緩存的運作機制
1、緩存依賴注入(DI)
當程序啟動時,Spring容器會讀取所有配置的Bean信息,將它們加入到緩存中。而當程序需要一個Bean時,容器就會直接從緩存中獲取這個Bean,而不是重新創建一個。在獲取Bean的過程中,容器遇到依賴注入的需求時,會從緩存中依次查找對應的Bean是否已經存在,如果已經存在,則直接返回,如果不存在,則創建這個Bean,並將其添加到緩存中。
2、緩存初始化
在容器初始化時,會把所有singleton類型的Bean都加入到singletonObjects緩存中,此時singletonFactories緩存為空。當需要獲取一個Bean時,會先從singletonObjects緩存中尋找,如果找不到,會創建一個新的實例,並且存儲在earlySingletonObjects緩存中,至此,對象就形成了一個單例工廠模型。在實例創建完成後,會將其從earlySingletonObjects移動到singletonObjects緩存中。
3、延遲加載初始化
當Bean是通過延遲加載方式(例如:@Lazy)初始化時,在容器初次啟動時,該Bean只被加入到singletonFactories緩存中。
當程序需要獲取該Bean時,Spring會查找該Bean是否已經創建過了。如果還未創建,它會從singletonFactories緩存中獲取ObjectFactory對象,並調用getObject()方法獲取該Bean,並且形成一個單例工廠模型。最後把Bean放入earlySingletonObjects緩存中,等待繼續完成創建和初始化。如果該Bean已經創建了,那麼放回緩存中已經存在的同一個實例。
4、一個案例
為了更好的理解三級緩存工作機制,下面帶着案例來說明:
public class App { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(AppConfig.class); System.out.println("------容器啟動完成------"); ((Student)context.getBean("student")).say(); ((Student)context.getBean("student")).say(); ((Student)context.getBean("student")).say(); } } @Configuration public class AppConfig { @Bean(name="student") @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) public Student getStudent() { System.out.println("------singletonFactories------"); return new Student(); } } class Student{ int age = 1; public void say(){ System.out.println(age); age++; } }
運行後的結果為:
------容器啟動完成------ ------singletonFactories------ 1 2 3
在上面的例子中,註解了@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON),將參數設置成單例模式,按照上述的三層緩存邏輯,當請求student Bean時,將在三級別緩存中依次查找,同時在對象工廠緩存中創建bean,並放入earlySingletonObjects緩存中,當構造完成後,即調用Student Bean的初始化方法後,將該對象裝入singletonObjects緩存中,等待進一步的操作。
三、總結
理解Spring框架的三級緩存的運行機制可以幫助我們更好地使用Spring框架,提高應用程序的性能。三級緩存是Spring框架中對單例對象進行緩存的機制,包含了singletonObjects、earlySingletonObjects和singletonFactories三層緩存。在獲取Bean的過程中,容器遇到依賴注入的需求時,會從緩存中依次查找對應的Bean是否已經存在,如果已經存在,則直接返回,如果不存在,則創建這個Bean,並將其添加到緩存中。通過三層緩存的方式,Spring實現了Bean的單例模式,有效避免了因頻繁創建和銷毀Bean對象而造成的系統性能問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/288765.html