0

注入する正しい春豆を選択するのに問題があります。前のクラスへの呼び出しに応じて、どの Bean を注入するかをスプリング コンテナーに伝える方法が必要です。Spring Bean の配線はすべて xml で行います。

私の質問:これは可能ですか?それが実装に関する参照である場合は?

私が達成しようとしていることを説明するために、いくつかのサンプル コードを作成しました。実行時に選択した reportType に応じて正しい ReportHeader Bean が注入されるように、自由に変更してください。

public enum ReportType{
    Credit,
    Annul   
}

public class ReportService {

    private ReportHeaderService reportHeaderService;
    private ReportType reportType;

    public ReportService (){}

    public setReportType(ReportType reportType){
        this.reportType = reportType;
    }

    public void setReportHeaderService(ReportHeaderService reportHeaderService){
        this.reportHeaderService = reportHeaderService;
    }

    private void generateHeader(){
        //i would like to call my service like this and have the correct bean injected to ReportHeader.
        reportHeaderService.generateHeader(reportType)
    }
}

public class ReportHeaderService {

    private ReportHeader reportHeader;

    //this will call the injected bean that needs to be selected accoring to the ReportType
    public void generateHeader(ReportType type){
        reportHeader.createHeader();
    }
}

public interface ReportHeader{
    public void createHeader();
}

public class CreditReportHeader implements ReportHeader{
    public void createHeader(){
        ..dostuff();
    }
}

public class AnnulReportHeader implements ReportHeader{
    public void createHeader(){
        ..dostuff();
    }
}
4

2 に答える 2

1

に従って をReportHeaderFactory取得するように を定義できます。ReportHeaderReportType

public class ReportHeaderFactory {
    private CreditReportHeader creditReportHeader;
    private AnnulReportHeader annulReportHeader;

    public ReportHeader getReportHeader(ReportType reportType) {
        switch (reportType) {
        case Credit:
            return creditReportHeader;
        case Annul:
            return annulReportHeader;
        default:
            throw new IllegalArgumentException("No Such Header");
        }
    }
}

ReportHeaderServiceのインスタンスで を再定義しReportHeaderFactoryます。

public class ReportHeaderService {

    //private ReportHeader reportHeader;
    private ReportHeaderFactory headerFactory;

    //this will call the injected bean that needs to be selected accoring to the ReportType
    public void generateHeader(ReportType type){
        //reportHeader.createHeader();
        headerFactory.getReportHeader(type);
    }
}

Spring Bean の配線はすべて xml で行っているため、設定ファイルに以下のエントリを作成するだけで済みます。

    <bean id="ReportHeaderService" class="x.y.ReportHeaderService">
        <property name="headerFactory" ref="headerFactory" />
    </bean>

    <bean id="headerFactory" class="x.y.ReportHeaderFactory">
        <property name="creditReportHeader" ref="creditReportHeader" />
        <property name="annulReportHeader" ref="annulReportHeader" />
    </bean>

    <bean id="creditReportHeader" class="x.y.CreditReportHeaderImpl" />
    <bean id="annulReportHeader" class="x.y.AnnulReportHeaderImpl" />
于 2013-09-27T10:19:17.073 に答える