我正在开发一个包含多个spring配置java类的项目。其中许多都有来自其他配置类的bean自动装入,然后注入其他bean的构造函数中。
为了使其尽可能灵活,我一直在使用spring配置文件来定义在多个可用的情况下要使用的接口实现。
这很好用,但我想知道Spring是否有任何方法可以定义默认bean?
例如:如果在类路径中找不到类型为Foo的bean,则注入实现Bar。否则,请忽略Bar。
我已经看过这个问题了:Spring 3: Inject Default Bean Unless Another Bean Present,如果你知道所有bean的名字,那么用Java配置显示的解决方案可以正常工作,但在我的情况下,我不知道bean被称为什么
有人知道可以实现的方法吗?
答案 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 }
}