使用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运算符创建特定的实现类。
如果我们为国家/地区使用相同的接口TaxCalculationService
和TaxCalculationServiceImplForCountryA
类,那么我们必须使用
@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>
答案 0 :(得分:3)
一种可能的选择是使用Spring Profiles(@Profile
)。根据您在配置文件中配置的配置文件或通过系统属性传递到项目,您可以激活或停用Bean。