Spring依赖配置与自动装配的先后顺序问题

在Spring配置当中,对象的依赖可以通过显示的<property>进行配置,也可以通过autowire自动装配。


那么问题来了:如果一个依赖进行了<property>配置,同时又存在符合的对象进行了autowire装配,最终保留哪个,其先后顺序是怎样的?


配置内容:

<bean id="chinese" class="myspring.Chinese"  autowire="byType" >
<property name="zhejiang">
        <bean class="myspring.Zhejiang"></bean>
    </property>
</bean>

<bean id="zhejiang" class="myspring.Zhejiang"></bean>


对象:

public class Chinese {
    private Zhejiang zhejiang;
    //get set ...
}


通过容器获取chinese对象输出他的zhejiang属性。获取zhejiang对象并输出得到:

myspring.Zhejiang@41e36e46
myspring.Zhejiang@15c43bd9

问题一的答案:两个不同的对象,说明最终以property配置为准。

疑问二:是先进行了自动装配而后由property配置进行的覆盖,还是先由property注入而后由自动装配的程序判断依赖未进行property申明再进行注入?

假设先自动装配,而后进行property配置进行覆盖,那么如下配置可正常执行:

<bean id="chinese" class="myspring.Chinese"  autowire="byType" >
    <property name="zhejiang.name" value="浙江人"></property>
</bean>
<bean id="zhejiang" class="myspring.Zhejiang"></bean>

按照假设,通过类型将zhejiang对象注入chinese的依赖中,然后进行的组合属性“zhejiang.name=浙江人”的设置可正常进行。

运行结果是:Invalid property 'zhejiang' of bean class [myspring.Chinese]: Value of nested property 'zhejiang' is null 空指针错误。

【问题二的答案】说明Spring的执行过程应该是先property配置,然后再进行autowire的注入。当进行autowire匹配注入的时候,先判断该依赖(属性)是否已由property申明,未申明再将对象引用赋值给它。


按照这个测试,配置文件显式的配置优于自动装配,且先进行显式配置后进行自动装配。



此处又做了一个测试,当Chinese创建时,就实例化一个Zhejiang赋值给zhejiang属性。再由Spring配置文件进行依赖注入。这里主要是为了判别,以上的自动装配是因为由property申明了而不再进行注入,还是因为property使得依赖非空而不进行注入(我最初猜测自动装配是判断依赖为空才进行的注入。)


对象:

public class Chinese {
    
    private Zhejiang zhejiang;
    public Chinese(){
    zhejiang = new Zhejiang
    System.out.println(zhejiang);
    }
    //get set ...
}

配置内容:

<bean id="chinese" class="myspring.Chinese"  autowire="byType" >
</bean>

<bean id="zhejiang" class="myspring.Zhejiang"></bean>

执行:

        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        Chinese person = ctx.getBean("chinese", Chinese.class);
        System.out.println(person.getZhejiang());

结果:

        myspring.Zhejiang@4b6995df
        myspring.Zhejiang@2c9f9fb0

结果表明:

       即使引用存在对象,依然会进行依赖注入。以上的自动装配之所以未执行,是因为进行了property的申明,而未进行装配注入。自动装配不是依据其依赖是否为空做判断。


当然,查看其源代码则更清楚其实际的逻辑。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值