2017-04-20 31 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()); 
    } 

} 
相關問題