在@Bean方法中创建的Spring @Configuration bean没有被CGLIB增强

时间:2012-06-08 15:28:29

标签: spring spring-annotations

我正在尝试使用@Bean方法而不是@Import创建一个导入另一个Config的MainConfig,如下所示:

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

我错过了什么或不支持吗?

由于

2 个答案:

答案 0 :(得分: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过滤器将其排除,因为您将获得循环引用。

答案 1 :(得分:0)

我开了一张春季门票SpringSource JIRA,他们说这是一个已知的限制,它按设计工作。