Spring学习(5) Spring中的自动装配(基于XML)


本文是看W3Cschool教程所写

1.Spring中提供的两种装配方式

  • 手动装配:以value或ref的方式来明确指定属性值都是手动装配
  • 自动装配:根据bean标签的autowire属性指定的装配规则,不需要明确指定,Spring自动把匹配的属性值注入bean中

自动装配的规则,即autowire的属性值有:

  • no或default:不自动装配
  • byName:根据bean的属性名自动装配,以当前bean的属性名作为id从IOC容器中寻找以实现装配。找到则装配,找不到则不装配
  • byType:根据bean属性类型自动装配,找到一个则装配,找到多个则报错,找不到则不装配

2.对于自动装配的初步介绍

在前面几篇博客中,我们已经知道了如何使用元素来声明 bean 和通过使用 XML 配置文件中的和元素来注入 。Spring 容器可以在不使用和 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。

2.1自动装配模式

可以使用元素的 autowire 属性为一个 bean 定义指定自动装配模式。

模式 描述
no 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。
byName 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
byType 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。
constructor 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
autodetect(3.0版本不支持) Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。

可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合。

2.2 自动装配的局限性

限制 描述
重写的可能性 你可以使用总是重写自动装配的 <constructor-arg>和 <property> 设置来指定依赖关系。
原始数据类型 你不能自动装配所谓的简单类型包括基本类型,字符串和类。
混乱的本质 自动装配不如显式装配精确,所以如果可能的话尽可能使用显式装配。

3.Spring自动装配语法及规则

  • 在bean标签添加属性:Autowire就可以了
    • byName
      • 对象中属性和容器中的beanid进行匹配,如果属性名和beanid一致,则自动装配
    • byType
      • 对象中的属性类型与容器中bean的class进行匹配,如果唯一匹配则自动装配
      • 匹配0个:未装配
      • 匹配多个:会报错
  • 基于XML的方式,只能装配非字面量的值

4.Spring自动装配 byName

  • 由属性名称指定指定自动装配
    在这里插入图片描述

5.Spring自动装配byType

  • 由属性类型指定指定自动装配
  • 比如:在配置文件中,有一个bean定义设置为自动装配byType,并且包含SpellChecker类型的spellChecker属性
  • 那么Spring就会查找类型为SpellChecker的bean,并且用它来设置这个属性
  • 我们仍然可以使用property标签来连接其他属性
    在这里插入图片描述

6.总结

  • 基于XML自动装配,底层使用set注入
  • 不建议使用byName,byType
  • 建议使用注解的方式自动装配

猜你喜欢

转载自blog.csdn.net/qq_52797170/article/details/125500362