【Spring】Bean的自动装配

Bean的自动装配



自动装配

当Bean的属性很少的时候,我们对它进行配置的时候就使用很少的<constructor-arg>或者<property>元素进行装配,但是随着工程体积的增大,Bean也可能变得复杂,这时候配置文件也会变得复杂,<constructor-arg><property> 就会变得很多,写起来就会很费劲,还好Spring为我们提供了自动装配的机制。

autowire的模式

Spring IOC容器可以自动装配Bean,只需要在<bean> 的autowire属性中指定装配的模式。
首先创建一个Person类,生成getter和setter方法,重写toString方法:
这里写图片描述

因为属性中依赖Address类和Car类,然后继续创建这两个类,生成getter方法和setter方法,重新toString方法:
这里写图片描述

接下来进行配置:
这里写图片描述
这是我们正常配置时候的样子,让我们运行一下:
这里写图片描述
结果没有问题。

这是例子比较简单,属性比较少,但是可以拓展思维的想象,如果属性很多的话,绿色矩形中的p标签就会越来越多,接下来我们就使用自动装配的功能。
Spring自动装配的模式有以下4种:
1. byName(根据名称自动装配):根据Bean的名字(或者id)和当前Bean的setter风格的属性进行
自动装配,如果有匹配的则进行装配,没有的匹配的则该属性不进行装配。
我们修改配置文件:
这里写图片描述
这样对于person,就会根据setter对应属性名字去和Bean进行匹配,通过id匹配address、通过name匹配car。运行一下:
这里写图片描述
没毛病,证明自动装配成功了。
我们修改一下address的名字然后运行一下:
这里写图片描述
由结果可以看到address的值为null,证明如果没有匹配到合适的Bean就不进行装配。
2. byType(根据类型自动装配):根据Bean的类型和当前Bean的属性的类型进行自动装配,若没有匹配的则不进行装配。
我们把autowire的方式修改为byType,运行一下:
这里写图片描述
看到虽然address的id为address1,但是最后还是装配成功了,因为byType匹配的是Bean的类型,但是这种方式存在问题,IOC容器中有一个以上的类型匹配的Bean,就会抛出异常,我们添加一个Bean,car2,然后发现编译器直接就报错了,运行更不要说了,抛出了org.springframework.beans.factory.NoUniqueBeanDefinitionException异常,告诉我们匹配的Bean不是唯一的。
这里写图片描述
3. constructor(通过构造器自动装配):根据构造器入参的类型匹配相同类型的Bean进行注入,和byType类似,就不放截图了,当出现相同类型的多个Bean时也会有问题,当有多个构造器的时候情况也会很复杂,平时使用的很少。
4. autodetect:首先尝试使用constructor进行自动装配,如果失再尝试使用byType进行自动装配。

autowire的缺点

  1. 在Bean配置文件中涉及autowire属性进行自动装配将会配置Bean的所有属性,然而,若只希望装配个别属性时,autowire就不够灵活了。
  2. autowire要么根据类型自动装配要么根据名字自动装配,不能两者兼顾。
  3. 在一般情况下,在实际的项目中很使用自动装配的功能,因为和自动装配功能带来的好处比起来,明确清晰的配置文档更好一些。
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值