2012-06-08 27 views
2

我試圖創建一個通過使用@Bean方法,而不是@Import這樣導入另一個配置一個MainConfig增強:在@Bean方法創建春@Configuration豆不CGLIB

@Configuration 
public class MainConfig { 

    @Bean 
    public Service service() { 
    return new Service(infrastructureConfig().database()); 
    } 

    @Bean 
    public OtherService otherService() { 
    return new OtherService(infrastructureConfig().database()); 
    }  

    @Bean 
    public InfrastructureConfig intrastructureConfig() { 
    return new InfrastructureConfig(); 
    } 

} 


@Configuration 
public class InfrastructureConfig { 

    @Bean 
    public Database database() { 
    return new Database(); 
    } 

    ... 
} 

使用時這個技巧,數據庫被創建了兩次,因爲Spring似乎沒有考慮到InfrastructureConfig上的@Configuration註解。當使用@Import時,它工作正常。

我不想使用@Import因爲我想模仿我InfrastructureConfig這樣的:

@Configuration 
public class TestConfig extends MainConfig { 

    @Override 
    public InfrastructureConfig infrastructureConfig() { 
    return mock(InfrastructureConfig.class); 
    } 
} 

我缺少的東西,或者是不支持?

感謝

回答

0

我打開了一張春季票SpringSource JIRA,他們說這是一個已知的限制,它按照設計工作。

0

當我第一次嘗試了的Spring Java配置,我認爲我做了同樣的假設,很驚訝,當它沒有工作。

我不確定這是解決這個問題的最好方法,但我已經成功地使用了以下方法。

要包括@Configuration類,你可以將此註釋添加到您的MainConfig

@ComponentScan(basePackages = "org.foo", includeFilters = {@Filter(filterType = ANNOTATION, value = CONFIGURATION)}, excludeFilters = {@Filter(filterType = ASSIGNABLE_TYPE, value = MainConfig)})

由於@Configuration類也是組件掃描考生這可以讓你掃描與@Configuration註釋的所有類。由於您將此註釋放在MainConfig上,因此您需要使用ASSIGNABLE_TYPE過濾器排除該註釋,因爲您將獲得循環引用。