@Autowired的what&how
在spring框架下,我们可以通过@Autowired
注解对属性或者方法参数进行标注,当spring ioc
容器初始化时,会帮我们从容器中拿到对应的实例进行注入
什么是循环依赖
假如现在有两个Bean
如下所示
public class BeanA {
@Autowired
private BeanB beanB;
}
public class BeanB {
@Autowired
private BeanA beanA;
}
然后我们通过annotationConfigApplicationContext#register
将两个bean
的信息注入到容器中,最后通过refresh
进行容器到初始化操作
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(Bean1.class);
annotationConfigApplicationContext.register(Bean2.class);
annotationConfigApplicationContext.refresh();
}
可以看到A跟B互相依赖,试着想象:当容器先初始化beanA
时,必然要对属性beanB进行赋值,这个时候容器中还没有beanB
,那么势必会触发beanB
的初始化流程,而beanB
初始化的完成也需要对属性beanA
赋值,但beanA
还未初始化完成,这里就产生了所谓的循环依赖。
spring如何解决循环依赖
这里有一个很关键的属性:
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
}
key是beanName,value是一个对象工厂,我们点进去看一下