Spring 3默认bean

时间:2014-10-21 14:22:19

标签: java spring dependency-injection

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

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

这很好用,但我想知道Spring是否有任何方法可以定义默认bean?

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

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

有人知道可以实现的方法吗?

1 个答案:

答案 0 :(得分: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 }
}