【问题标题】:Spring @Configuration bean created in @Bean method not enhanced by CGLIB在 @Bean 方法中创建的 Spring @Configuration bean 未由 CGLIB 增强
【发布时间】:2012-10-06 03:41:55
【问题描述】:

我正在尝试创建一个 MainConfig,它使用 @Bean 方法而不是像这样的 @Import 导入另一个 Config:

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

是我遗漏了什么还是不支持?

谢谢

【问题讨论】:

    标签: spring spring-annotations


    【解决方案1】:

    当我第一次尝试 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 过滤器将其排除,因为您将获得循环引用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多