第三章 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. 这个类,感觉设计得有点搓。

猜你喜欢

转载自my.oschina.net/u/1261452/blog/1859012