构造函数注入,为什么不能解决循环依赖

1. 结论

解决循环依赖的核心是,实例化和初始化分开

构造函数注入和属性注入,如果是引用类型,那么创建引用对象的时机是不同的。

  • 对于构造函数注入,是在解析构造函数参数的时候去创建引用对象的,此时当前的类还没有完成实例化,如果相互引用那么实例化对象都不能完成的话,就无法解决循环依赖。
autowireConstructor(){
//.....
minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
}
  • 属性注入是在填充属性的时候去创建对象的,此时当前的类型已经完成的实例化

2.xml 配置


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">




    <bean id="person" class="com.songbl.testinject.Person" autowire="byName" >
        <property name="id" value="1">property>
        <property name="name" value="zhangsan">property>


        



    bean>

    <bean id="address" class="com.songbl.testinject.Address"/>







<bean id="person" class="com.songbl.testinject.Person" >
    
            <constructor-arg name="id" value="1">constructor-arg>
            <constructor-arg name="name" value="lisi">constructor-arg>
            
           <constructor-arg name="address" ref="address">constructor-arg>
bean>







beans>

你可能感兴趣的:(Spring源码解析,spring)