在一次开发中项目突然抛出了BeanCurrentlyInCreationException异常。解决方案是找到循环注入的问题,并重新设计其中的类。当出现循环注入时证明设计的是有问题的。jvm允许循环引用,spring也可以解决循环注入。那为什么还会报错。
定位到报错是因为循环注入时报错,那么就从spring注入一个bean的方式来分析,大家都知道spring提供了三类注册方式。
1.直接在要注入的对象上加注解@Autowired @Resource等。
2.在set方法上加注解.
3.在构造方法中直接注入。
先说结论:1, 2 种spring是可以解决循环注入问题的。但是,当时项目用的第一种,却抛出BeanCurrentlyInCreationException异常。
先大体说一下spring是如何解决循环引用的:
spring初始化一个bean分为三部(单例模式):
- createBeanInstance 这个时候就是对这个bean调用构造方法,但是没有对里面的属性进行赋值,注入等操作。
- populateBean,填充属性,这步对配置中指定的property进行populate。这个时候发生注入行为。
- initializeBean,调用配置中指定的初始化方法(xml中配置的,或者@P