欢迎观看《Spring Framework实战》视频教程
-
-
-
- 自动装配合作者
-
-
Spring容器可以自动连接协作bean之间的关系。您可以通过检查ApplicationContext的内容,让Spring自动为您的bean解析协作者(其他bean)。自动装配具有以下优点:
- 自动装配可以显著减少指定属性或构造函数参数的需要。(本章其他地方讨论的bean模板等其他机制在这方面也很有价值。)
- 自动装配可以随着对象的演变而更新配置。例如,如果需要向类添加依赖关系,则可以自动满足该依赖关系,而无需修改配置。因此,自动装配在开发过程中特别有用,而不会否定在代码库变得更加稳定时切换到显式装配的选项。
当使用基于XML的配置元数据时(请参阅依赖注入),您可以使用<bean/>元素的autowire属性为bean定义指定autowire模式。自动装配功能有四种模式。您可以为每个bean指定自动连线,从而可以选择要自动连线的bean。下表描述了四种自动接线模式:
表1自动化模式 | |
模式 | 解释 |
no | (默认)没有自动连接。Bean引用必须由ref元素定义。不建议对较大的部署更改默认设置,因为明确指定协作者可以提供更大的控制和清晰度。在某种程度上,它记录了系统的结构。 |
byName | 按属性名称自动装配。Spring寻找与需要自动连接的属性同名的bean。例如,如果一个bean定义被设置为按名称自动连接,并且它包含一个主属性(即它有一个setMaster(..)方法),Spring会查找一个名为master的bean定义并使用它来设置该属性。 |
byType | 如果容器中只存在一个属性类型的bean,则允许对属性进行自动连接。如果存在多个异常,则会抛出致命的异常,这表示您可能无法对该bean使用byType自动连接。如果没有匹配的bean,则不会发生任何事情(属性未设置)。 |
constructor | 类似于byType,但适用于构造函数参数。如果容器中没有一个构造函数参数类型的bean,则会引发致命错误。 |
使用byType或构造函数自动连接模式,您可以连接数组和类型化集合。在这种情况下,容器中与预期类型匹配的所有自动连线候选者都会被提供以满足依赖关系。如果预期的键类型为String,则可以自动连接强类型的Map实例。自动连接的Map实例的值由与预期类型匹配的所有bean实例组成,Map实例的键包含相应的bean名称。
-
-
-
-
- 自动化的局限性和缺点
-
-
-
自动装配在整个项目中一致使用时效果最佳。如果一般不使用自动连接,那么使用它来连接一两个bean定义可能会让开发人员感到困惑。
考虑自动装配的局限性和缺点:
- 属性和构造函数参数设置中的显式依赖关系始终覆盖自动连接。您无法自动连接简单属性,如基元、字符串和类(以及此类简单属性的数组)。这种限制是设计出来的。
- 自动装配不如显式装配精确。尽管如前表所示,Spring在出现可能产生意外结果的歧义时会小心避免猜测。Spring托管对象之间的关系不再明确记录。
- 从Spring容器生成文档的工具可能无法获得接线信息。
- 容器中的多个bean定义可能与要自动连接的setter方法或构造函数参数指定的类型匹配。对于数组、集合或Map实例,这不一定是问题。然而,对于期望单个值的依赖关系,这种模糊性并不是任意解决的。如果没有唯一的bean定义,则抛出异常。
在后一种情况下,您有几个选择:
- 放弃自动装配,转而采用显式装配。
- 如下一节所述,通过将bean定义的autowire候选属性设置为false来避免bean定义的自动装配。
- 通过将<bean/>元素的main属性设置为true,将单个bean定义指定为主要候选。
- 实现基于注释的配置提供的更细粒度的控制,如基于注释的容器配置中所述。
-
-
-
- 从自动装配中排除Bean
-
-
-
在每个bean的基础上,您可以从自动连线中排除bean。在Spring的XML格式中,将<bean/>元素的autowire候选属性设置为false;使用@Bean注释,该属性被命名为autowireCandidate。容器使得特定的bean定义对自动装配基础设施不可用,包括基于注释的注入点,如@Autowired。
autowire候选属性旨在仅影响基于类型的自动装配。它不影响按名称的显式引用,即使指定的bean未标记为自动装配候选,这些引用也会被解析。因此,如果名称匹配,按名称自动装配仍会注入bean。
您还可以根据与bean名称的模式匹配来限制自动连线候选者。顶级<beans/>元素在其默认的autowired candidate属性中接受一个或多个模式。例如,要将autowire候选状态限制为名称以Repository结尾的任何bean,请提供*Repository的值。要提供多种模式,请在逗号分隔的列表中定义它们。bean定义的autowire候选属性的显式值true或false总是优先。对于此类bean,模式匹配规则不适用。
这些技术对于那些你永远不想通过自动连线注入其他bean的bean很有用。这并不意味着被排除的bean本身不能通过自动连线进行配置。相反,bean本身不是自动连线其他bean的候选者。
从6.2开始,@Bean方法支持autowire候选标志的两种变体:autowireCandidate和defaultCandidate。 使用限定符时,标记为defaultCandidate=false的bean仅适用于存在额外限定符指示的注入点。这对于那些应该在某些区域注射但不打算在其他地方妨碍同类型豆子的受限代表来说很有用。这样的bean永远不会只通过明文声明的类型注入,而是通过类型加上特定的限定符注入。 相比之下,autowireCandidate=false的行为与上述autowireCandidate属性完全相同:这样的bean根本不会按类型注入。 |