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的申明,而未进行装配注入。自动装配不是依据其依赖是否为空做判断。


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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud的自动装配原理是通过Spring Boot的自动配置机制来实现的。Spring Boot提供了一种约定优于配置的方式,根据项目中所引入的依赖配置文件的内容来自动配置应用程序的各个组件。 具体来说,Spring Cloud通过在类路径下查找特定的依赖配置,来自动装配相应的组件。它会根据依赖顺序配置的优先级来决定使用哪个实现。自动装配可以减少开发者的工作量,提供了一种快速构建分布式系统的方式。 Spring Cloud的自动装配原理主要涉及以下几个方面: 1. 条件装配:Spring Cloud使用条件注解(如@ConditionalOnClass、@ConditionalOnProperty等)来判断某个类是否存在或某个属性是否配置,从而决定是否装配相关组件。 2. 自动配置类:Spring Cloud通过编写自动配置类来完成各个组件的自动装配自动配置类通常使用@Configuration注解标识,并在类上使用@EnableAutoConfiguration注解启用自动配置。 3. 自定义配置:开发者可以通过在配置文件中设置特定的属性值来自定义组件的行为。Spring Cloud会根据配置文件中的属性值来进行相应的自动装配。 4. 自动装配顺序Spring Cloud根据依赖配置的优先级来确定自动装配顺序。通常情况下,先装配核心组件,再装配其他依赖组件。 5. 条件装配的细粒度控制:Spring Cloud提供了一些高级的条件注解(如@ConditionalOnBean、@ConditionalOnMissingBean等)来实现更细粒度的条件装配控制。 总之,Spring Cloud通过Spring Boot的自动配置机制实现了对分布式系统组件的自动装配,大大简化了分布式系统的开发和配置工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值