2013-06-18 18 views
0

我們如何在布爾型的Spring Context XML中切換不同的實現? 例如:我們如何在布爾型的Spring Context XML中切換不同的實現?

<bean id="detailsController" class="com.something.detailsController" > 

如果爲true,則

<property name="dao" ref="firstDao"/> 

其他

<property name="dao" ref="secoundDao"/> 

我知道Spring3我們可以使用配置文件

+0

不確定您是否可以在xml級別執行此操作。你可以做的可能是將兩個daos作爲lazy init連接到類中,並連接布爾條件。然後在該類中根據布爾條件使用dao。在這種情況下,只會創建使用的dao實例 –

回答

0

你可以通過修改Java代碼並使用Spring EL和ApplicationAwareInitializingBean來做到這一點。

public class DetailsController implements ApplicationContextAware, InitializingBean { 

    private DetailsControllerDAO dao; 

    private String daoName; 

    private ApplicationContext applicationContext; 

    public void setApplicationContext(ApplicationContext applicationContext) { 
     this.applicationContext = applicationContext; 
    } 

    public void afterPropertiesSet() { 
     dao = applicationContext.getBean(daoName); 
    } 

    public void setDaoName(String daoName) { 
     this.daoName = daoName; 
    } 

} 

在XML:

<bean id="detailsController" class="com.something.detailsController"> 
    <property name="daoName" value="#{myCondition ? 'firstDao' : 'secondDao'}" /> 
</bean> 

當然,這種方案的缺點來添加依賴性春代碼在你的控制器。爲了避免這種情況,您可以將代碼移到代理類中,如Guillaume Darmont所述。

0

我不認爲這可以在完成工作XML級別。

0

春天真的不能那樣做。查看bean生命週期。創建了類,而不是注入屬性,並且調用了afterPropertiesSet()或@PostConstructor方法。當然,當我省略懶惰的初始化bean。

但是如果你想測試等等,所以你只需要在應用程序中的firstDao或secondDao同時取決於你的設置,你可以使用一個bean工廠。 bean工廠根據需要創建你的bean。我也用它來分割開發環境,測試環境和生產環境。

package com.dummyexample.config; 

import javax.annotation.Resource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 


/** 
* Factory bean to create real or test dao. 
* The result depends on realDaoEnabled configuration parameter. 
* 
* @author Martin Strejc 
*/ 
@Configuration 
public class DaoBeanFactory { 


    // mapping to servlet context configuration 
    @Resource(mappedName = "realDaoEnabled") 
    private Boolean realDaoEnabled = true; 

    // TestDao extends or implements Dao 
    @Autowired 
    private TestDao testDao; 

    // ProdDao extends or implements Dao 
    @Autowired 
    private ProdDao prodDao; 

    public DaoBeanFactory() { 
    } 

    @Bean(name="dao") 
    public Dao getDao() { 
     if(realDaoEnabled) { 
      return prodDao; 
     } 
     return testDao; 
    } 


} 
0

由於您的DAO是可交換的,它們繼承相同類型(抽象類或接口)。因此你可以寫一個RoutingDetailsControllerDAO

比方說,你的通用接口被命名爲DetailsControllerDAO,有兩種方法getDetailsgetMoreDetails,代碼將是:現在

public class RoutingDetailsControllerDAO implements DetailsControllerDAO { 
    private DetailsControllerDAO firstDAO; 
    private DetailsControllerDAO secondDAO; 

    protected DetailsControllerDAO getDAOToUse() { 
     return YOUR_BOOLEAN_CONDITION ? firstDAO : secondDAO; 
    } 

    @Override 
    public Details getDetails() { 
     return getDAOToUse().getDetails(); 
    } 

    @Override 
    public Details getMoreDetails() { 
     return getDAOToUse().getMoreDetails(); 
    } 

    // Insert firstDAO and secondDAO setters below 
    ... 

} 

你的Spring XML配置爲:

<bean id="detailsController" class="com.something.detailsController" > 
    <property name="dao" ref="routingDetailsControllerDAO"/> 
</bean> 
<bean id="routingDetailsControllerDAO" class="com.something.RoutingDetailsControllerDAO"> 
    <property name="firstDao" ref="firstDao"/> 
    <property name="secondDao" ref="secondDao"/> 
</bean> 
0

幾種可能性:

  • 您可以使用配置文件(<beans profiles="profileOne">)。
  • 您可以使用FactoryBean創建正確的DAO
  • 您可以使用SPEL

最後一個是最簡單的:

<bean id="detailsController" class="com.something.detailsController"> 
    <property name="dao" ref="#{condition ? 'firstDao' : 'secondDao'}" /> 
</bean> 

當然你也可以從性質裝載bean名通過文件屬性配置器:

<bean id="detailsController" class="com.something.detailsController"> 
    <property name="dao" ref="${bean.name.from.properties.file}" /> 
</bean> 
相關問題