2017-04-20 5 views
1

내 프로젝트는 다른 프로젝트에 종속되어 있고 @ImportResource("foo.xml")을 사용하여 빈을 가져옵니다.주석 또는 xml 설정없이 기본 bean 만들기

내가 datasource1에게 차를 (그래서 봄 부팅의 모든 자동 구성이 작동합니다)하고 싶습니다,이 데이터 소스 (datasource1datasource2)를 정의합니다.

가능합니까? determinePrimaryCandidate 메서드를 가진 DefaultListableBeanFactory가 있다는 것을 알았습니다. 그래서 내 생각으로는 내 자신의 ListableBeanFactory를 만들면 DefaultListableBeanFactory을 확장 할 수 있습니다.하지만 스프링 부트로 하여금 내 구현을 사용하도록 강제하는 방법은 무엇입니까?

또는 주어진 빈을 primary으로 표시하는 또 다른 쉬운 방법이 있습니다 (정의 된 구성을 변경하지 않고).

+0

이 프로젝트에 새로운 데이터 소스 콩을 만들 수 FakeDataSource

은 실행 가능한 예제를 만들기 위해, 단지 자리 표시 자입니다 'datasource1'을 인수로 주입합니까? 그런 다음이 메소드에'@ Primary'를 사용하여 주석을 달고'datasource1' 만 리턴하면됩니다. 너의 문제를 이해하면 알려줘. –

+0

@MikeWojtyna 시도했지만 작동하지 않습니다. 나는 두 가지 콩을 가지고 있다는 메시지를 받았고 Spring은 어느 것을 사용할 것인지 결정할 수 없습니다. –

+0

@Qualifier를 사용하여 bean을 구별하고 기본 bean의 이름을 지정하십시오. 나중에 당신을 위해 실례를 준비하려고 노력할 것입니다. –

답변

0

@Primary bean으로 주석 된 새 데이터 소스를 빌드하는 구성을 프로젝트에서 작성할 수 있습니다. 이 새로운 데이터 소스는 봄까지 새로운 데이터 소스 팩토리 메소드에 삽입 될 datasource1이 될 것입니다. 여기에 실제 예제가 있습니다.

는 config : 다음은 상황을 시뮬레이션 (FakeDataSource 클래스를 사용하여) 세 가지 콩을 볼

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

. primaryDataSource bean factory 메소드는 단순히 dataSource1을 반환합니다 (단순한 데이터 소스 선택 자일뿐입니다).

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()); 
    } 

}