Skip to content

使用 CustomAutowireConfigurer (Using CustomAutowireConfigurer)

CustomAutowireConfigurer 是一个 BeanFactoryPostProcessor,它允许你注册自己的自定义限定符注解类型,即使这些注解没有标有 Spring 的 @Qualifier 注解。

以下示例展示了如何使用 CustomAutowireConfigurer

xml
<bean id="customAutowireConfigurer"
		class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
	<property name="customQualifierTypes">
		<set>
			<value>example.CustomQualifier</value>
		</set>
	</property>
</bean>

AutowireCandidateResolver 通过以下方式决定自动装配候选者:

  • 每个 Bean 定义的 autowire-candidate 值。
  • <beans/> 元素上可用的任何 default-autowire-candidates 模式。
  • @Qualifier 注解的存在,以及通过 CustomAutowireConfigurer 注册的任何自定义注解。

当有多个 Bean 符合自动装配候选条件时,“首选 (Primary)”的确定如下:如果候选者中恰好有一个 Bean 定义的 primary 属性设置为 true,则选择该 Bean。


补充教学 —— 打破 Spring 的“限定”

1. 为什么要用 CustomAutowireConfigurer 通常我们定义限定符时,会直接在自定义注解上加一个 @Qualifier(即元注解)。但如果你在用一些第三方库,或者某些历史遗留代码中的注解,你没法改它们的源码(也就没法加 @Qualifier),这时 CustomAutowireConfigurer 就成了“救命稻草”。它相当于在外部“强行登记”,告诉 Spring:“虽然这个注解没求婚(没注 @Qualifier),但它也是咱们限定符家族的一员”。

2. 它是如何工作的? 因为它是一个 BeanFactoryPostProcessor,所以它在容器启动的早期阶段就运行了。它把这些注解类型塞进容器的“限定符白名单”里。之后当 AutowiredAnnotationBeanPostProcessor 扫描注入点时,就会把这些注解当作有效的限定符处理。

3. 自动装配的“海选”流程 文档中提到的 AutowireCandidateResolver 是 Spring 内部决定“谁能被注入”的终极裁判。它的判断逻辑可以抽象为三步:

  1. 门槛检查:这个 Bean 愿意被注入吗?(检查 autowire-candidate="false" 或者名称是否匹配 default-autowire-candidates)。
  2. 标签匹配:限定符(Qualifier)对得上吗?(包括 @Qualifier 和咱们今天聊的 CustomAutowire 注册的注解)。
  3. 终极 PK:如果有多个候选者,谁是老大?(检查 @Primary)。

4. 现实建议:少即是多 在实际的现代 Spring 开发中,这个类用得非常少。大部分场景下,自定义限定符注解配合元注解方案更清晰、更易维护。只有在整合那些不依赖 Spring 的 legacy 代码或强规范性框架时,才考虑使用这个扩展点。

Based on Spring Framework.