首页 文章

Spring 3默认bean

提问于
浏览
0

我正在开发一个具有多个spring配置java类的项目 . 其中许多都有来自其他配置类的bean自动装入,然后注入其他bean的构造函数中 .

为了使其尽可能灵活,我一直使用spring配置文件来定义在多个可用的情况下要使用的接口实现 .

这工作正常,但我想知道你是否有任何方式可以定义一个默认的bean?

例如:如果在类路径中找不到类型为Foo的bean,则注入实现Bar . 否则,请忽略Bar .

我已经看过这个问题了:Spring 3: Inject Default Bean Unless Another Bean Present,如果你知道所有bean的名字,那么用Java配置显示的解决方案可以正常工作,但在我的情况下,我不知道bean被调用了什么 .

有人知道这可以实现吗?

1 回答

  • 1

    将默认值定义为默认值,只需确保bean的名称相同,配置文件中的名称将覆盖默认值 .

    <beans>
    
        <!-- The default datasource -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        </bean>
    
        <beans profile="jndi">
            <jndi:lookup id="dataSource" jndi-name="jdbc/db" />
        </beans>
    
    </beans>
    

    此构造也适用于基于Java的配置 .

    @Configuration
     public DefaultConfig {
    
          @Bean
          public DataSource dataSource() { ... }
    
          @Configuration
          @Profile("jndi")
          public static class JndiConfig {
    
              @Bean
              public DataSource dataSource() { ... // JNDI lookup }
          }
    
     }
    

    使用基于java的配置时,您还可以指定默认值,并在另一个配置中添加该类型的另一个bean,并使用 @Primary 进行注释 . 找到多个实例时,应使用 @Primary 的实例 .

    @Configuration
    public DefaultConfig {
    
         @Bean
         public DataSource dataSource() { ... }
    }
    
    @Configuration
    @Profile("jndi")
    public class JndiConfig {
    
        @Bean
        @Primary
        public DataSource jndiDataSource() { ... // JNDI lookup }
    }
    

相关问题