使用 CustomAutowireConfigurer (Using CustomAutowireConfigurer)
CustomAutowireConfigurer 是一个 BeanFactoryPostProcessor,它允许你注册自己的自定义限定符注解类型,即使这些注解没有标有 Spring 的 @Qualifier 注解。
以下示例展示了如何使用 CustomAutowireConfigurer:
<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 内部决定“谁能被注入”的终极裁判。它的判断逻辑可以抽象为三步:
- 门槛检查:这个 Bean 愿意被注入吗?(检查
autowire-candidate="false"或者名称是否匹配default-autowire-candidates)。 - 标签匹配:限定符(Qualifier)对得上吗?(包括
@Qualifier和咱们今天聊的CustomAutowire注册的注解)。 - 终极 PK:如果有多个候选者,谁是老大?(检查
@Primary)。
4. 现实建议:少即是多 在实际的现代 Spring 开发中,这个类用得非常少。大部分场景下,自定义限定符注解配合元注解方案更清晰、更易维护。只有在整合那些不依赖 Spring 的 legacy 代码或强规范性框架时,才考虑使用这个扩展点。