问题

  • singletonObjects与earlySingletonObjects的作用
  • 如果singletonFactories中存放的内容
  • 如何解决循环引用问题
  • aop对应的代理类如何保存实例

spring 缓存

singletonObjects-一级缓存

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

spring 单例对象集合,所有的实例实例化完成后均需要保存在该变量中,该变量的key为bean name,value为spring管理的实例

在spring 创建实例完成后,添加至该缓存中,并且将该实例从earlySingletonObjects中移除,且将该实例对应的factory从singletonFactories中移除

singletonFactories-三级缓存

在bean初始化之初会将该bean生成ObjectFactory,并将该factory保存至singletonFactories中,在bean初始化完成后,会将该factory从singletonFactories中移除,并将bean保存至singletonObjects中

该变量用于处理循环依赖问题,假如bean a 依赖bean b,同时,bean b依赖bean a,则在初始化a时,先将未初始化完成,即未注入其它依赖bean的a实例通过ObjectFactory保存至singletonFactories中,然后处理bean b,当获取b时,发现b未实例化,故需要创建实例b,当创建b时,查询singletonObjects中是否存在 bean a,即判断bean a 是否已初始化完成,如果不存在,则判断singletonFactories中是否存在,如果存在,则将该实例注入至b中,然后b即创建完成,最后将b注入至a中,a即实例化完成,将a对应的factory从singletonFactories中移除,并将a保存至singletonObjects

earlySingletonObjects-二级缓存

private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

该变量用于存储未初始化完成的bean,即为singletonFactories中factory获取到的bean的缓存,当bean实例化完成后,会将bean从earlySingletonObjects中移除

在首次getSingleton(String beanName, boolean allowEarlyReference)时,如果该bean还未实例化(即在singletonObjects中查询不到)则会通过factory获取到bean,并且存放到earlySingletonObjects,下次不需要再次调用,通过earlySingletonObjects即可获取到该bean,但是该bean是未实例化完成的,当实例化完成(即所有的依赖均注入完成)时,会将该bean从earlySingletonObjects中删除

aop类的实例化

aop的实例化是通过BeanPostProcessor实现类AnnotationAwareAspectJAutoProxyCreator实现的,在该方法中,会判断该类是否存在针对该类的切面,如果存在,则创建代理类,如果不存在则返回原始类