我的项目依赖于另一个项目,并从中导入 Bean(使用 @ImportResource("foo.xml")
)。
foo.xml
定义了两个数据源(datasource1
和 datasource2
),我想让 datasource1
成为主要数据源(这样 Spring Boot 的所有自动配置都可以工作)。
这可能吗?我发现有一个DefaultListableBeanFactory
有 determinePrimaryCandidate
方法。
所以我的想法是创建我自己的 ListableBeanFactory,它将扩展 DefaultListableBeanFactory
,但是如何强制 Spring Boot 使用我的实现?
或者也许还有另一种更简单的方法将给定 bean 标记为primary
(无需更改定义它的配置)。
最佳答案
您可以在项目中创建一个配置,该配置会构建一个注释为 @Primary
bean 的新数据源。这个新数据源将是 datasource1
,它将由 spring 注入(inject)到新数据源工厂方法中。这里有工作示例。
配置:
@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());
}
}
关于java - 在没有注释或 xml 配置的情况下创建主要 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520993/