在不同的上下文中具有相同名称的两个bean

时间:2015-03-03 10:40:46

标签: java spring

我的上下文中有以下bean:

    <!-- Context 1 -->
<beans profile="ldap">
        <bean id="activeDirectoryAuthProvider" class="com.production.ActiveDirectoryLdapAuthenticationProvider">
          <constructor-arg value="${ldap.login.provider.domain}"/>
          <constructor-arg value="${ldap.login.provider.url}" />
          <property name="useAuthenticationRequestCredentials" value="true" />
          <property name="convertSubErrorCodesToExceptions" value="true" />
        </bean>
</beans>

<!-- Context 2 -->

    <bean id="activeDirectoryAuthProvider" class="com.test.TestActiveDirectoryLdapAuthenticationProvider">
      <constructor-arg value="${ldap.login.provider.domain}"/>
      <constructor-arg value="${ldap.login.provider.url}" />
      <property name="useAuthenticationRequestCredentials" value="true" />
      <property name="convertSubErrorCodesToExceptions" value="true" />
    </bean>

我的目标是仅将第一个bean用于生产版本,另一个用于测试目的。

即当我开始基于生产上下文测试时,我希望生产bean将被需要配置的测试bean替换。

但不幸的是,当我尝试创建两个具有相同名称的bean时,只创建了生产bean而忽略了另一个bean。另一件事我注意到,当我尝试将测试bean名称更改为: activeDirectoryAuthProvider1 时,两个bean都已成功创建。任何人都可以解释它为什么会发生并提出可能的解决方案如何绕过它?

2 个答案:

答案 0 :(得分:0)

您需要使用不同的上下文进行开发和生产。在每个上下文中,您只定义相关的bean(即只有一个具有特定名称的bean)。如果你使用maven,你可以将测试/开发上下文放在src / test / resources和src / main / resources下的生产上下文

如果您不使用maven,还有其他方法。您可以在此处找到示例:http://mrhaki.blogspot.it/2009/02/use-spring-configurator-to-support.html

答案 1 :(得分:0)

看一下Spring Profiles,你可以有一个用于测试,一个用于prod。

<beans profile="test">
     <!-- Context 1 -->

          <bean id="activeDirectoryAuthProvider" class="com.production.ActiveDirectoryLdapAuthenticationProvider">
             <constructor-arg value="${ldap.login.provider.domain}"/>
             <constructor-arg value="${ldap.login.provider.url}" />
             <property name="useAuthenticationRequestCredentials" value="true" />
             <property name="convertSubErrorCodesToExceptions" value="true" />
          </bean>
</beans>

<beans profile="prod">
      <!-- Context 2 -->

       <bean id="activeDirectoryAuthProvider" class="com.test.TestActiveDirectoryLdapAuthenticationProvider">
           <constructor-arg value="${ldap.login.provider.domain}"/>
           <constructor-arg value="${ldap.login.provider.url}" />
           <property name="useAuthenticationRequestCredentials" value="true" />
           <property name="convertSubErrorCodesToExceptions" value="true" />
       </bean>
</beans>

您可以通过各种方式设置活动配置文件。检查文档。