1.spring中如何解决循环依赖问题?
首先我们来说一下什么是循环依赖,所谓的循环依赖是指A类中有B类的属性,而B类中包含A类的属性。
spring中解决循环依赖有个前置条件,就是只针对scope是singleton的类才对循环依赖的问题给予解决,对prototype类型的不支持会抛出异常。spring在创建bean的时候,是不等bean创建完成就会将创建bean的objectFactory提前曝光,也就是将objectFactory加入到缓存中去,一但下一个bean创建的时候需要依赖上一个bean则直接使用objectFactory。
Spring在加载bean的时候都会首先去缓存中查找。
spring中加载bean时涉及到的缓存map的解释如下:
singletonObjects:用于保存BeanName和创建bean实例之间的关系,bean name--->bean instance;
singletonFactories:用于保存beanName 和创建bean工厂之间的关系。bean name-->ObjectFactory;
earlySingletonObjects: 也是用于保存BeanName和创建bean实例之间的关系,不同的是,当一个单例bean被放在这里面后,那么当bean还在创建过程中,就可以通过getBean方法获取到了,其目的是用来检查循环引用。
registeredSingletons:用来保存当前所有已注册的bean;
2.spring中的factoryBean接口。
spring提供了一个factoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。
其中有几个方法:
1). T getObject():返回由FactoryBean创建的bean实例
2).boolean isSingleton();返回判断bean的作用域是singleton还是prototype
3)Class<T> getObjectType():返回FactoryBean创建的bean类型