如何从Autowiring自动装配中排除Bean



使用autowire-candidate属性

一种方式是使用autowire-candidate属性完全排除bean成为自动装配候选者。

默认情况下,自动装配会扫描并匹配范围内的所有bean定义,如果要排除某些bean,从而让它们无法通过自动装配模式注入,可以将autowire-candidate属性设置为false

在xml中bean的配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <context:annotation-config />
 
    <!--Will not participate in autowiring-->
     <bean id="finance" class="com.example.foobar" autowire-candidate="false">
        <property name="name" value="foobar" />
    </bean>
</beans>

在SpringBoot中(从Spring 5.1开始),可以通过@Bean注解配置autowireCandidate属性,例如:

@Bean(autowireCandidate = false)
public Foobar foobar(){
    ...
}

bean名称的模式匹配

另一种选择是根据bean名称的模式匹配来限制自动装配候选者。default-autowire-candidates属性中接受一种或多种模式(以逗号分隔)。

在xml中bean的配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire-candidates="*Impl,*Dao">
    <context:annotation-config />
 
    <!--Will not participate in autowiring-->
     <bean id="finance" class="com.example.foobar">
        <property name="name" value="foobar" />
    </bean>
</beans>

请注意,bean定义的autowire-candidate属性的显式值truefalse始终优先,对于此类bean,模式匹配规则将不再适用。

autowire-candidate属性仅影响基于类型的自动装配。 它不会影响按名称的显式引用,即使指定的bean未标记为自动装配候选者,也会得到解析。 因此,如果名称匹配,按名称自动装配仍然会注入一个bean。

如果需要注入某些bean,但这些bean的autowire-candidate属性设置为false,或者被注入方不符合默认的自动装配候选者模式,则可以显式地通过名称注入(例如@Resource(name = "foobar"))或者通过BeanFactorygetBean方法获取。