如何表达对Spring中导入配置中定义的bean的依赖?

时间:2014-09-26 13:37:23

标签: java spring dependency-injection type-safety

我最近开始在一个使用Spring配置而不是XML的地方工作,到目前为止,我很喜欢它。

我的问题如下:

如果我们有一个@Configuration带注释的类A导入另一个@Configuration带注释的类B,那么在A中定义的bean依赖于在B中定义的bean的正确,类型安全的方法是什么? 。

这是我在博客(https://blog.codecentric.de/en/2012/07/spring-dependency-injection-styles-why-i-love-java-based-configuration/)中看到的一个例子:

@Configuration
public class PartnerConfig {

    @Bean
    public PartnerService partnerService() {
        return new PartnerServiceImpl();
    }

}

@Configuration
@Import(PartnerConfig.class)
public class CashingConfig {

    @Autowired
    private PartnerConfig partnerConfig;

    @Bean
    public CashingService cashingService() {
        return new CashingServiceImpl(partnerConfig.partnerService());
    }

}

作为我问题的第二部分,如果我要做上述操作,那么Spring会将其解释为bean依赖吗?也就是说,当我做的时候

partnerConfig.partnerService()

在上面的示例中,我是否让Spring获取partnerService bean,或者我只是调用常规java方法并创建PartherService的新实例(这不是我的意思)想要,因为bean应该是单身人士)?

编辑: 有人建议使用@Qualifier。这会有用吗?

@Configuration
public class PartnerConfig {

    @Bean
    @MyCustomQualifier
    public PartnerService partnerService() {
        return new PartnerServiceImpl();
    }

}

@Configuration
@Import(PartnerConfig.class)
public class CashingConfig {

    @Bean
    public CashingService cashingService(@MyCustomQualifier PartnerService partnerService) {
        return new CashingServiceImpl(partnerService);
    }

}

2 个答案:

答案 0 :(得分:1)

只需将依赖项作为参数添加到@Bean带注释的方法中,然后删除配置的自动装配。

@Configuration
@Import(PartnerConfig.class)
public class CashingConfig {

    @Bean
    public CashingService cashingService(PartnerService partnerService) {
        return new CashingServiceImpl(partnerService);
    }

}

或只是自动装配PartnerService而不是配置。

@Configuration
@Import(PartnerConfig.class)
public class CashingConfig {

    @Autowire
    private PartnerService partnerService;

    @Bean
    public CashingService cashingService() {
        return new CashingServiceImpl(partnerService);
    }

}

答案 1 :(得分:1)

我建议您阅读文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html

请参阅以下部分:

  

@Configuration类中的@Bean方法

总结得很好。

  

通常,@ Node方法在@Configuration类中声明。在这种情况下,bean方法可以通过直接调用它们来引用同一个类中的其他@Bean方法。这可以确保bean之间的引用是强类型和可导航的。

另请查看:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

部分:

  

撰写@Configuration类