1. 程式人生 > >第三章 spring-bean之DefaultSingletonBeanRegistry(3)

第三章 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,但是這種方式,隱藏得太深了。鳥菜啊,實在不想看了。

總結

  1. ObjectFactory物件在目前的spring體系裡面極少使用。包括其他框架對spring整合幾乎沒有使用。所以DefaultSingletonBeanRegistry相關的程式碼可以忽視。
  2. 全域性變數containedBeanMap的邏輯可以忽視。
  3. 這個類,感覺設計得有點搓。