0

私は春を通してインスタンス化しようとしている次のクラスを持っています。

class MyBean{

    MyBean myBeanFallback;
    MyDataObject myDataObject;

    public void setMyBeanFallback(MyBean myBeanFallback){
        this.myBeanFallback = myBeanFallback;
    }

    MyBean(MyDataObject myDataObject){
        this.myDataObject = myDataObject;
    }

}

以下は、これをロードするために使用しようとしているスプリング構成です。

<bean name="myNewBean" class="MyBean"
    scope="prototype">
    <constructor-arg index="0"  type="MyDataObject" >
        <null />
    </constructor-arg>
    <property name="myBeanFallback" ref="myOldBean" />
</bean>

<bean name="myOldBean" class="MyBean"
    scope="prototype">
    <constructor-arg index="0"  type="MyDataObject" >
        <null />
    </constructor-arg>
</bean>

私のアプリケーション コードでは、データを持ち、フォールバックを持たない myOldBean をインスタンス化することがあります。それ以外の場合は、データを持ち、フォールバックとして myOldBean を持つ myNewBean をインスタンス化することができます。これには、同じ myDataObject も必要です。

getNewBean(MyData mydata){
 return (MyBean) context.getBean("myNewBean", new Object[] { mydata });
}


getOldBean(MyData mydata){
 return (MyBean) context.getBean("myOldBean", new Object[] { mydata });
}

私が今直面している問題は、myNewBean を取得しているときに、フォールバック getNewBean に mydata が入力されず、null が取得されることです。

これを修正する方法についての指針はありますか?

4

3 に答える 3

1

Spring ではそれができません。を取得するとmyNewBeanmyBeanFallback( myOldBean) プロパティはコンストラクターで指定された値で正しくインスタンス化されます。nullこの動作を変更することはできませmyBeanFallbackFactoryBean.getBean()
おそらく、この方法でファクトリを使用すると解決策になる可能性があります。

class MyBeanFactory {
  public getNewBean(MyData mydata){
    MyBean myBean = (MyBean) context.getBean("myNewBean", new Object[] { mydata });
    MyBean myBeanFallback = getOldBean(myData);
    myBean.setMyBeanFallback(myBeanFallback);
    return myBean;
  }


  public getOldBean(MyData mydata){
     return (MyBean) context.getBean("myOldBean", new Object[] { mydata });
  }
}

およびbeans.xml

<bean name="myNewBean" class="MyBean" scope="prototype" />
<bean name="myOldBean" class="MyBean" scope="prototype" />
于 2013-08-28T19:50:56.313 に答える
0

@bellabax は正しい考えを持っています。

これに関するもう 1 つのポイントは、FactoryBean ( Spring マニュアルへのリンク) を使用して、scope=prototype である Bean の構築をカスタマイズできることです。したがって、myOldBean をそのままにして、次のようにして myNewBean の構築をカスタマイズできます。

<bean name="myNewBean" class="MyNewFactoryBean" scope="prototype">
    <property name="myData"><!-- however you want to provide the value for this --></property>
</bean>

そして、FactoryBean の実装:

public class MyNewFactoryBean implements FactoryBean<MyBean> {

    protected MyData myData;

    public void setMyData(MyData d) {
        myData = d;
    }

    @Override
    public MyBean getObject() throws Exception {
        MyBean myBean = new MyBean();
        myBean.setMyBeanFallback(context.getBean("myOldBean", new Object[] { myData }));
        return myBean;
    }

    @Override
    public Class<MyBean> getObjectType() {
        return MyBean.class;
    }
    .... 
}

そのようにすると、(コードの後半で)context.getBean("myNewBean")通常どおりに何かを実行でき、MyNewFactoryBean からカスタムのインスタンス化ロジックを呼び出すことができます。

于 2013-08-28T20:09:18.920 に答える
0

この種のことをしたことはありませんが、ここに私の $.05 があります: myOldBean 定義はプロトタイプとしてスコープされているため、Spring では内部的にその名前で認識されていますが、null です。したがって、myNewBean インスタンスを作成すると、その null 参照が使用されます。

Spring がそのように使用されることを意図していたとは思いません。私は間違っているかもしれませんが、コンストラクター全体が getBean に値を渡すことは、Spring の目標の 1 つをバイパスすることです。xml ファイルで指定したように、Spring にオブジェクトを構成してリンクさせます。xml とコードでの Bean の作成を混在させると、あなたの場合...

したがって、私のアドバイスは次のとおりです。構成全体を春に配置してみてください。

于 2013-08-28T19:52:41.023 に答える