Spring Bean 循环依赖

容器中有两个ConcurrentHashMap 用于解决循环依赖问题,ObjectHashMap和FactoryHashMap,分别用于存放完美的和不完美的对象。

Spring一扫描,发现AService中需要一个BService。

然后就开始找,ObjectHashMap中有没有完美的BService啊?有就直接用,没有接着去FactoryHashMap中找。如果有就用,虽然不完美,起码比没有好。

如果这两个里面都没有,那就没招了,再去new一个吧。

先创建AService,其构造函数中需要BService,然后又去创建BService。

发现在BService的构造函数中又需要AService,又去创建AService,因为当前正在创建Aervice,再去创建就会报异常:BeanCurrentlyInCreationException。

对于默认的单例Bean,可以通过上面的缓存方式解决循环依赖。Spring容器是不会对多例的Bean进行缓存的,所以多例Bean也是不能循环依赖的。

最佳实践:
1.最好将Autowired注解标注在属性上。
2.构造函数方式与多例Bean是不能解决循环依赖的问题的。