2017-04-20 27 views
1

我的项目对另一个文件有依赖关系,并从它导入bean(使用@ImportResource("foo.xml"))。制作一个没有注释或xml配置的bean主文件

定义了两个数据源(datasource1datasource2),我想作datasource1主(所以春天启动的所有自动配置将工作)。

可能吗?我发现有一个DefaultListableBeanFactorydeterminePrimaryCandidate方法。 所以这个想法是创建我自己的ListableBeanFactory,这将扩展DefaultListableBeanFactory,但如何强制Spring Boot使用我的实现?

或者也许有另一个更简单的方法来标记一个给定的豆primary(不需要改变它定义的配置)。

+0

你能在项目中创建一个新的数据源豆并注入你的'datasource1'作为参数?然后,你可以用'@ Primary'注释这个方法,并简单地返回'datasource1'。请让我知道,如果我明白你的问题。 –

+0

@MikeWojtyna我试过了,但它不起作用。我得到消息说我有两个bean,Spring不能决定使用哪一个。 –

+0

使用@Qualifier来区分您的bean并命名您的主要bean。我会尽力为你准备一个有用的例子。 –

回答

0

您可以在您的项目中创建一个配置,该配置将构建一个注释为@Primary bean的新数据源。这个新的数据源将是datasource1,它将在春季注入新的数据源工厂方法。这里有你的工作示例。

的配置:

@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; 
    } 
} 

这里你可以看到三种豆(使用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()); 
    } 

} 
相关问题