2014-10-21 2 views
0

Я работаю над проектом с несколькими классами java конфигурации весны. Многие из них имеют bean-компоненты из других классов конфигурации, которые были автоматически добавлены в конструкторы других bean-компонентов.Spring 3 default beans

Чтобы сделать это максимально гибким, я использовал весенние профили, чтобы определить, какую реализацию интерфейса использовать в случае, когда доступно несколько.

Это прекрасно работает, но мне было интересно, есть ли какой-либо путь с Spring, который вы могли бы определить по умолчанию?

Например: Если фаза типа Foo не найдена на пути к классам, введите строку реализации. Остальное, игнорируйте Bar.

Я рассмотрел этот вопрос: Spring 3: Inject Default Bean Unless Another Bean Present, и решение, показанное с конфигурацией Java, будет работать нормально, если вы знаете имя всех компонентов, но в моем случае я не буду знать, какие вызовы вызывают.

Кто-нибудь знает, каким образом это может быть достигнуто?

ответ

1

Определите значение по умолчанию так же, как и значение по умолчанию, просто убедитесь, что имя компонента является тем же самым, что внутри профиля будет переопределять значение по умолчанию.

<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 вы можете также указать значения по умолчанию и в другой конфигурации добавить еще один компонент этого типа и аннотировать его с @Primary. При обнаружении нескольких экземпляров следует использовать один с @Primary.

@Configuration 
public DefaultConfig { 

    @Bean 
    public DataSource dataSource() { ... } 
} 

@Configuration 
@Profile("jndi") 
public class JndiConfig { 

    @Bean 
    @Primary 
    public DataSource jndiDataSource() { ... // JNDI lookup } 
} 
+0

спасибо. Первичным было то, что я искал. :) –