我的项目依赖于另一个项目,并从中导入bean(使用@ImportResource("foo.xml")
)。
foo.xml
定义了两个数据源(datasource1
和datasource2
),我想让datasource1
成为主数据库(因此所有Spring Boot的自动配置都可以工作)。
有可能吗?我发现DefaultListableBeanFactory
有determinePrimaryCandidate
方法。
所以我的想法是创建我自己的ListableBeanFactory,它将扩展DefaultListableBeanFactory
,但是如何强制Spring Boot使用我的实现?
或许还有另一种更简单的方法可以将给定的bean标记为primary
(不改变定义它的配置)。
答案 0 :(得分:0)
您可以在项目中创建配置,该配置构建一个注释为@Primary
bean的新数据源。这个新的数据源将是datasource1
,它将由spring注入新的数据源工厂方法。这里有你的工作实例。
配置:
@SpringBootApplication
public class BeanSpringExampleApplication
{
@Bean(name = "dataSource1")
public FakeDataSource dataSource1()
{
return new FakeDataSource("dataSource1");
}
@Bean(name = "dataSource2")
public FakeDataSource dataSource2()
{
return new FakeDataSource("dataSource2");
}
@Bean
@Primary
public FakeDataSource primaryDataSource(
@Qualifier("dataSource1") FakeDataSource dataSource1)
{
return dataSource1;
}
}
在这里,您可以看到三个bean(使用FakeDataSource
类),它可以模拟您的情况。 primaryDataSource
bean工厂方法只返回dataSource1
(它只是一个数据源选择器)。
FakeDataSource
只是一个占位符,可以运行示例:
public class FakeDataSource
{
private final String fakeProperty;
public FakeDataSource(String id)
{
fakeProperty = id;
}
/**
* @return the fakeProperty
*/
public String getFakeProperty()
{
return fakeProperty;
}
}
最后,一个证明一切正常的测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class BeanSpringExampleApplicationTests
{
@Autowired
private FakeDataSource fakeDataSource;
@Test
public void should_AutowirePrimaryDataSource() throws Exception
{
assertEquals("dataSource1", fakeDataSource.getFakeProperty());
}
}