2012-06-08 46 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过滤器排除该注释,因为您将获得循环引用。