0

ブール値を使用して Spring Context XML の異なる実装を切り替えるにはどうすればよいですか? 例えば:

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

もし本当なら

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

そうしないと

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

Spring3ではプロファイルを操作できることを知っています

4

5 に答える 5

0

ApplicationAwareJava コードを変更し、Spring EL をおよび と一緒に使用することで、これを行うことができますInitializingBean

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>

もちろん、このソリューションには、コントローラー内の Spring コードへの依存関係を追加するという欠点があります。これを回避するには、Guillaume Darmont が説明しているように、そのコードをプロキシ クラスに移動できます。

于 2013-06-18T21:52:02.590 に答える
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;
    }


}
于 2013-06-18T20:55:35.133 に答える
0

DAO は交換可能であるため、同じ型 (抽象クラスまたはインターフェイス) を継承します。したがって、 と書くことができますRoutingDetailsControllerDAO

共通のインターフェイスが という名前DetailsControllerDAOで、2 つのメソッドがgetDetailsあり、getMoreDetails内部にあるとします。コードは次のようになります。

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>
于 2013-06-18T21:34:46.110 に答える
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>
于 2013-06-18T22:04:07.573 に答える
0

これが XML レベルで実行できるとは思いません。

于 2013-06-18T14:36:18.670 に答える