在基于Java的配置中,Spring DI解决依赖于运行时而不是编译时的美感是否已经丢失?

时间:2015-09-04 12:50:26

标签: java spring dependency-injection spring-ioc

使用Spring依赖注入,我们可以从代码中删除硬编码的依赖关系,依赖关系可以在运行时而不是编译时解决

几年前,我们正在为两个国家实施一个项目。几乎所有模块都是相同的 除了一个模块-tax计算。

该计划不是针对两个不同的国家/地区进行两次打包,我们只会为两个国家/地区打包一次。

所以我们有一个TaxCalculationService接口,其中一个方法calculateTax(...)

两个实现TaxCalculationServiceImpl接口

的国家/地区的两个TaxCalculationService

如下所示

TaxCalculationServiceImplForCountryA implements TaxCalculationService
TaxCalculationServiceImplForCountryB implements TaxCalculationService

我们从经理类(calculateTax(...))调用了TaxCalculationManagerImpl方法。

我们有弹簧配置文件保存在文件夹外面,战争说/home/config/

两个战争都部署到两个不同的服务器。战争,打包一次,唯一的区别是在spring配置文件中。

<!-- For country A-->
<bean id="taxCalculationService" class="com.TaxCalculationServiceImplForCountryA"/>

<bean id="taxCalculationManager" class="com.TaxCalculationManagerImpl">
        <property name="taxCalculationService" ref="taxCalculationService"/>
</bean>

对于国家B,我们需要修改bean名称为“taxCalculationService”的类名,没有别的

<!-- For country B-->
<bean id="taxCalculationService" class="com.TaxCalculationServiceImplForCountryB"/>

<bean id="taxCalculationManager" class="com.TaxCalculationManagerImpl">
        <property name="taxCalculationService" ref="taxCalculationService"/>
</bean>

因此,在不进行重新编译的情况下,我们很容易对两个国家/地区使用相同的应用程序战争,只更改了弹簧配置文件。

  

但是在Spring - 基于Java的配置中,如果我们想实现相同的场景,我们将如何做到这一点?

在我们创建bean时,我们使用new运算符创建特定的实现类

如果我们为国家/地区使用相同的接口TaxCalculationServiceTaxCalculationServiceImplForCountryA类,那么我们必须使用

@Bean
public TaxCalculationService getTaxCalculationService(){             
    return new TaxCalculationServiceImplForCountryA();          
}

对于国家B,我们需要做这样的事情

@Bean
public TaxCalculationService getTaxCalculationService(){
    return new TaxCalculationServiceImplForCountryB();
}

因此,在这种情况下,我们需要使用 new运算符为特定国家/地区创建TaxCalculationService 的特定实现类。那么我们在xml中的灵活性如何基于Spring的配置,随着重新编译,打包战争,我们重用了战争,这在Java Based Configuration方法中无法实现。

taxCalculationManager依赖于taxCalculationService以及taxCalculationManager是否将调用TaxCalculationServiceImplForCountryA或TaxCalculationServiceImplForCountryB的calculateTax(...),它将在基于xml的弹簧配置中在运行时决定。

但是当我们必须在java代码中指定getTaxCalculationService()将返回新的TaxCalculationServiceImplForCountryA()或new TaxCalculationServiceImplForCountryB()时,它基本上不会在运行时解析。

因此,taxCalculationManager对taxCalculationService的依赖关系在运行时无法解析,它基本上是在编译时解析的。

所以你不认为在 Spring - 基于Java的配置中,Spring DI解决了运行时依赖性而不是编译时间的缺点吗? < / p>

1 个答案:

答案 0 :(得分:3)

一种可能的选择是使用Spring Profiles(@Profile)。根据您在配置文件中配置的配置文件或通过系统属性传递到项目,您可以激活或停用Bean。