spring 中 bean 标记的主要和自动装配候选属性的差异 b/w

Difference b/w primary and autowire-candidate attribute of bean tag in spring

我是 spring 的新手。当我按类型进行自动布线时,我开始了解这些属性 primary 和 autowire-candidate。

我没有得到确切的区别b/w这两个因为将这些参数设置为 false 将使另一个 bean 成为自动装配的候选对象。

谁能帮我理解这两个。

谢谢

假设有接口

interface Translator { String translate(String word);}

您的应用程序广泛使用翻译器将英语翻译成波兰语。但是,在某些特定情况下您要使用专用翻译器,因为词汇是特定的。例如,字符串总是表示 "sequence of characters" 但绝不表示 "underwear".

示例配置:

<bean class="EnglishToPolishTranslator" />
<bean class="ComputerScienceEnglishToPolishTranslator" autowire-candidate="false"/>

所有地方 EnglishToPolishTranslator 都将被自动装配,除了一些具体的地方 ComputerScienceEnglishToPolishTranslator 将通过引用注入。

某天下一位客户提出要求:使用更简单的词。通过classSimpleEnglishToPolishTranslator实现需求。但是计算机科学翻译应该保持不变:修改它的成本太高了。

贵公司希望产品易于维护。基础应用程序不会被修改,但对于客户来说,产品将通过配置的额外库进行扩展:

<bean class="SimpleEnglishToPolishTranslator" primary="true"/>

结果,除计算机科学领域外,所有地方 SimpleEnglishToPolishTranslator 都将被使用。

也许它过于复杂,但显示了我在 autowire-candidate 和 primary 之间发现的差异

顺便说一句,"autowire-candidate" 没有相应的注释。在我看来 "autowire-candidate" 是 Spring 进化的死胡同

如果我们多次使用不同的 id 配置 bean,那么 IOC 将抛出异常。为了克服这个重复的 bean 问题,我们可以使用 autowire-candidate=”false”primanry="true"

示例:我有两个 类 手机和处理器

案例-1:autowire-candidate=”false”

<bean id="mobile" class="com.Mobile" autowire="byType">
    <property name="mobileName" value="Redmi"></property>
    <property name="mobileModel" value="Note 5"></property>
</bean> 

<bean id="process1" class="com.Processor" 
autowire-candidate="false">
    <property name="process" value="2GHz"></property>
    <property name="ram" value="4GB"></property>
</bean>

<bean id="process2" class="com.Processor">

    <property name="process" value="1GHz"></property>
    <property name="ram" value="3GB"></property>
</bean>

根据上面的配置,process1 bean 将被忽略,process2 bean 将被注入。

案例-2:primanry="true"

<bean id="mobile" class="com.Mobile" autowire="byType">
    <property name="mobileName" value="Redmi"></property>
    <property name="mobileModel" value="Note 5"></property>
</bean> 

<bean id="process1" class="com.Processor" primary="true">
    <property name="process" value="2GHz"></property>
    <property name="ram" value="4GB"></property>
</bean>

<bean id="process2" class="com.Processor">

    <property name="process" value="1GHz"></property>
    <property name="ram" value="3GB"></property>
</bean>

根据上面的配置,process2 bean 将被忽略,process1 bean 将被注入。