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 将被注入。
我是 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 将被注入。