publicclassDefaultSingletonBeanRegistryextendsSimpleAliasRegistryimplementsSingletonBeanRegistry{protectedstaticfinalObjectNULL_OBJECT=newObject();protectedfinalLoglogger=LogFactory.getLog(this.getClass());//存放单例对象privatefinalMap<String,Object>singletonObjects=newConcurrentHashMap(64);privatefinalMap<String,ObjectFactory<?>>singletonFactories=newHashMap(16);privatefinalMap<String,Object>earlySingletonObjects=newHashMap(16);privatefinalSet<String>registeredSingletons=newLinkedHashSet(64);privatefinalSet<String>singletonsCurrentlyInCreation=Collections.newSetFromMap(newConcurrentHashMap(16));privatefinalSet<String>inCreationCheckExclusions=Collections.newSetFromMap(newConcurrentHashMap(16));privateSet<Exception>suppressedExceptions;privatebooleansingletonsCurrentlyInDestruction=false;privatefinalMap<String,Object>disposableBeans=newLinkedHashMap();privatefinalMap<String,Set<String>>containedBeanMap=newConcurrentHashMap(16);privatefinalMap<String,Set<String>>dependentBeanMap=newConcurrentHashMap(64);privatefinalMap<String,Set<String>>dependenciesForBeanMap=newConcurrentHashMap(64);publicDefaultSingletonBeanRegistry(){}//注册单例对象publicvoidregisterSingleton(StringbeanName,ObjectsingletonObject)throwsIllegalStateException{Assert.notNull(beanName,"'beanName' must not be null");synchronized(this.singletonObjects){ObjectoldObject=this.singletonObjects.get(beanName);if(oldObject!=null){thrownewIllegalStateException("Could not register object ["+singletonObject+"] under bean name '"+beanName+"': there is already object ["+oldObject+"] bound");}else{//不存在,添加this.addSingleton(beanName,singletonObject);}}}//添加单例对象到map中protectedvoidaddSingleton(StringbeanName,ObjectsingletonObject){synchronized(this.singletonObjects){this.singletonObjects.put(beanName,singletonObject!=null?singletonObject:NULL_OBJECT);this.singletonFactories.remove(beanName);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}//篇幅长,其他省略...}
publicfinalObjectreadObject()throwsIOException,ClassNotFoundException{if(enableOverride){returnreadObjectOverride();}...try{//关键方法Objectobj=readObject0(false);...returnobj;}finally{...}}privateObjectreadObject0(booleanunshared)throwsIOException{...//switch语句caseTC_ENUM://关键readEnum()方法returncheckResolve(readEnum(unshared));...}privateEnum<?>readEnum(booleanunshared)throwsIOException{if(bin.readByte()!=TC_ENUM){thrownewInternalError();}ObjectStreamClassdesc=readClassDesc(false);if(!desc.isEnum()){thrownewInvalidClassException("non-enum class: "+desc);}intenumHandle=handles.assign(unshared?unsharedMarker:null);ClassNotFoundExceptionresolveEx=desc.getResolveException();if(resolveEx!=null){handles.markException(enumHandle,resolveEx);}Stringname=readString(false);Enum<?>result=null;Class<?>cl=desc.forClass();if(cl!=null){try{@SuppressWarnings("unchecked")Enum<?>en=Enum.valueOf((Class)cl,name);result=en;}catch(IllegalArgumentExceptionex){throw(IOException)newInvalidObjectException("enum constant "+name+" does not exist in "+cl).initCause(ex);}if(!unshared){handles.setObject(enumHandle,result);}}handles.finish(enumHandle);passHandle=enumHandle;returnresult;}
可以发现枚举类型其实通过类名和 Class 对象类找到一个唯一的枚举对象。因此枚举对象不可能被类加载器加载多次。
privateObjectreadOrdinaryObject(booleanunshared)throwsIOException{if(bin.readByte()!=TC_OBJECT){thrownewInternalError();}ObjectStreamClassdesc=readClassDesc(false);desc.checkDeserialize();Class<?>cl=desc.forClass();if(cl==String.class||cl==Class.class||cl==ObjectStreamClass.class){thrownewInvalidClassException("invalid class descriptor");}Objectobj;try{//调用了 ObjectStreamClass 的 isInstantiable()方法obj=desc.isInstantiable()?desc.newInstance():null;}catch(Exceptionex){throw(IOException)newInvalidClassException(desc.forClass().getName(),"unable to create instance").initCause(ex);}...returnobj;}//代码很简单booleanisInstantiable(){requireInitialized();return(cons!=null);}
privateObjectreadOrdinaryObject(booleanunshared)throwsIOException{if(bin.readByte()!=TC_OBJECT){thrownewInternalError();}ObjectStreamClassdesc=readClassDesc(false);desc.checkDeserialize();Class<?>cl=desc.forClass();if(cl==String.class||cl==Class.class||cl==ObjectStreamClass.class){thrownewInvalidClassException("invalid class descriptor");}Objectobj;try{//obj被创建,不为空obj=desc.isInstantiable()?desc.newInstance():null;}catch(Exceptionex){throw(IOException)newInvalidClassException(desc.forClass().getName(),"unable to create instance").initCause(ex);}...//if判断,调用hasReadResolveMethod()if(obj!=null&&handles.lookupException(passHandle)==null&&desc.hasReadResolveMethod()){Objectrep=desc.invokeReadResolve(obj);if(unshared&&rep.getClass().isArray()){rep=cloneArray(rep);}if(rep!=obj){// Filter the replacement objectif(rep!=null){if(rep.getClass().isArray()){filterCheck(rep.getClass(),Array.getLength(rep));}else{filterCheck(rep.getClass(),-1);}}handles.setObject(passHandle,obj=rep);}}returnobj;}
ObjectinvokeReadResolve(Objectobj)throwsIOException,UnsupportedOperationException{requireInitialized();if(readResolveMethod!=null){try{//调用readResolveMethodreturnreadResolveMethod.invoke(obj,(Object[])null);}catch(InvocationTargetExceptionex){Throwableth=ex.getTargetException();if(thinstanceofObjectStreamException){throw(ObjectStreamException)th;}else{throwMiscException(th);thrownewInternalError(th);// never reached}}catch(IllegalAccessExceptionex){// should not occur, as access checks have been suppressedthrownewInternalError(ex);}}else{thrownewUnsupportedOperationException();}}