2019独角兽企业重金招聘Python工程师标准>>>
前言
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 singletonObjects = new ConcurrentHashMap(256);
singletonObjects 保存所有单例对象
private final Map> singletonFactories = new HashMap>(16);
singletonFactories 保存所有单例ObjectFactory
private final Map earlySingletonObjects = new HashMap(16);
earlySingletonObjects
private final Set registeredSingletons = new LinkedHashSet(256);
registeredSingletons 保存所有单例对象的名字。registeredSingletons= singletonObjects.keySet() + singletonFactories.keySet()
private final Set singletonsCurrentlyInCreation =
Collections.newSetFromMap(new ConcurrentHashMap(16));
singletonsCurrentlyInCreation 作用是解决单例对象只会创建一次,当创建一个单例对象的时候会向singletonsCurrentlyInCreation添加beanName,另外一个线程创建的时候,也会添加beanname到singletonsCurrentlyInCreation,add方法返回false就报异常
private final Set inCreationCheckExclusions =
Collections.newSetFromMap(new ConcurrentHashMap(16));
inCreationCheckExclusions存在的beanName,可以并发创建。
private Set suppressedExceptions;
suppressedExceptions 作用当从ObjectFactory获得对象时出现异常,把suppressedExceptions的异常一并抛出。作用不大。
private boolean singletonsCurrentlyInDestruction = false;
singletonsCurrentlyInDestruction 作用是当AbstractApplicationContext 销毁的时候,会销毁beanFactory里面所有单例对象。销毁所有单例对象的时候,singletonsCurrentlyInDestruction设为true。在getSingleton的时候,识别singletonsCurrentylInDestruction就拒绝获得bean。并报异常。
private final Map disposableBeans = new LinkedHashMap();
保存需要销毁的beans。
private final Map> containedBeanMap = new ConcurrentHashMap>(16);
整个没有用。全局查看了调用连,没有一个连有实际作用的。
private final Map> dependentBeanMap = new ConcurrentHashMap>(64);
private final Map> dependenciesForBeanMap = new ConcurrentHashMap>(64);
头疼的dependent。@DependsOn注解以及在spring boot体系里面其他与之相关的注解。的关系都会注册在这里面。可能还有其他的方式获得depend,但是这种方式,隐藏得太深了。鸟菜啊,实在不想看了。
总结
- ObjectFactory对象在目前的spring体系里面极少使用。包括其他框架对spring集成几乎没有使用。所以DefaultSingletonBeanRegistry相关的代码可以忽视。
- 全局变量containedBeanMap的逻辑可以忽视。
- 这个类,感觉设计得有点搓。