第三章 spring-bean之DefaultSingletonBeanRegistry(3)
前言
SingletonBeanRegistry是一個非常重要的介面,用於註冊,獲得,管理singleton物件。
SingletonBeanRegistry目前唯一的實現是DefaultSingletonBeanRegistry,DefaultSingletonBeanRegistry不僅僅實現了SingletonBeanRegistry介面,還管理,維護了singlenton其他方面的東西。
- 負責管理singlenton物件,
- 負責管理ObjectFactory物件
- 負責管理singleanton物件與ObjectFactory物件的 beanName
- 負責管理signleton狀態中需要執行銷燬流程的物件
- 負責需要管理@Dependent註解以及spring boot裡面的功能相同的註解產生的依賴關係與被依賴關係
- 負責控制併發情況下銷燬beanfactory
- 負責控制併發情況下只有一個執行緒註冊同一個bean。
SingletonBeanRegistry 介面
public interface SingletonBeanRegistry { void registerSingleton(String beanName, Object singletonObject); Object getSingleton(String beanName); boolean containsSingleton(String beanName); String[] getSingletonNames(); int getSingletonCount(); Object getSingletonMutex(); }
實現
變數作用詳解
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
singletonObjects 儲存所有單例物件
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
singletonFactories 儲存所有單例ObjectFactory
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
earlySingletonObjects
private final Set<String> registeredSingletons = new LinkedHashSet<String>(256);
registeredSingletons 儲存所有單例物件的名字。registeredSingletons= singletonObjects.keySet() + singletonFactories.keySet()
private final Set<String> singletonsCurrentlyInCreation =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
singletonsCurrentlyInCreation 作用是解決單例物件只會建立一次,當建立一個單例物件的時候會向singletonsCurrentlyInCreation新增beanName,另外一個執行緒建立的時候,也會新增beanname到singletonsCurrentlyInCreation,add方法返回false就報異常
private final Set<String> inCreationCheckExclusions =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
inCreationCheckExclusions存在的beanName,可以併發建立。
private Set<Exception> suppressedExceptions;
suppressedExceptions 作用當從ObjectFactory獲得物件時出現異常,把suppressedExceptions的異常一併丟擲。作用不大。
private boolean singletonsCurrentlyInDestruction = false;
singletonsCurrentlyInDestruction 作用是當AbstractApplicationContext 銷燬的時候,會銷燬beanFactory裡面所有單例物件。銷燬所有單例物件的時候,singletonsCurrentlyInDestruction設為true。在getSingleton的時候,識別singletonsCurrentylInDestruction就拒絕獲得bean。並報異常。
private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();
儲存需要銷燬的beans。
private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);
整個沒有用。全域性查看了呼叫連,沒有一個連有實際作用的。
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
頭疼的dependent。@DependsOn註解以及在spring boot體系裡面其他與之相關的註解。的關係都會註冊在這裡面。可能還有其他的方式獲得depend,但是這種方式,隱藏得太深了。鳥菜啊,實在不想看了。
總結
- ObjectFactory物件在目前的spring體系裡面極少使用。包括其他框架對spring整合幾乎沒有使用。所以DefaultSingletonBeanRegistry相關的程式碼可以忽視。
- 全域性變數containedBeanMap的邏輯可以忽視。
- 這個類,感覺設計得有點搓。