0

2つの質問があります...

1)Springコンテナが初期化され、get bean()メソッドが呼び出される前にBeanがSpringコンテナ自体で初期化されるというクエリがあります。これはデフォルトの動作です。どのようにアプリケーションをそのように設定できますかその Bean は、getbean() の呼び出しが行われたときにのみコンテナーで初期化する必要があります。これを実現するために、Bean をプロトタイプとして宣言します。

2) 2 番目のクエリは、最初に以下の例を確認してください...

 <beans>
<bean id="triangle"  class="Demo.Triangle" scope="singleton" >
<property  name="pointA" ref="zeropoint"/>
<property  name="pointB" ref="firstpoint"/>
<property  name="pointC" ref="secondpoint"/>
</bean>

<bean id="zeropoint"  class="Demo.Point"  scope="prototype" >
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>


<bean id="firstpoint"  class="Demo.Point"  scope="prototype" >
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>

<bean id="secondpoint"  class="Demo.Point" scope="prototype">
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>

上で示したように、三角形の Bean はシングルトンであり、シングルトンにアクセスすると参照される Bean はプロトタイプであり、他の参照 Bean の zeropoint、firstpoint、および secondpoint も三角形に関して 1 回だけ初期化されますが、ここでは、これら 3 つの Bean の新しいインスタンスが毎回作成されることを望みます。三角形の Bean がフェッチされたときに作成されるようにするには、どのように達成できるかアドバイスしてください。ApplicationContextAware インターフェイスを実装する私の pojo を介して達成可能ですか、アドバイスしてください

4

2 に答える 2

3

Spring インフラストラクチャ ( ) に依存する代わりに、BeanFactoryAwareルックアップ メソッド機能を試すことをお勧めします。

abstract class Triangle {

    public abstract Point createZeroPoint();
    public abstract Point createFirstPoint();
    public abstract Point createSecondPoint();

    public void foo() {
        Point p0 = createZeroPoint();
        Point p1 = createFirstPoint();
        Point p2 = createSecondPoint();
    }

}

create*Point()抽象メソッドを呼び出すたびに、 の新しいインスタンスが作成されますPoint。しかし、このメソッドをどのように実装し、どの Bean を返すかをどのように知るのでしょうか? Spring はこれを実装します。

<bean id="triangle" class="Demo.Triangle" scope="singleton">
    <lookup-method name="createZeroPoint" bean="zeropoint"/>
    <lookup-method name="createFirstPoint" bean="firstpoint"/>
    <lookup-method name="createSecondPoint" bean="secondpoint"/>
</bean>

包括的なドキュメントを確認してください: 4.4.6.1 ルックアップ メソッド インジェクション

于 2012-07-11T19:03:43.930 に答える
2
  1. レイジーローディングと呼ばれる

    <bean id="myBean" class="a.b.MyBean" lazy-init="true"/>

    • firstpoint最初に、およびsecondpointBean に有効なスコープ定義がないことに注意してください( を見逃していましたscope=)
    • プロトタイプ スコープとは、プロトタイプ Bean を必要とするすべての Bean が独自のインスタンスを取得することを意味します。すべての三角形に依存する複数の三角形を定義するzeropointと、個別のzeropointインスタンスになります。
    • 三角形クラス内で新しいポイント インスタンスが必要な場合 (たとえば、三角形のメソッドを呼び出すたびに) は、Bean ファクトリから直接インスタンスを受け取るのが最善の方法です。

例えば

class MyClass implements BeanFactoryAware {

  private BeanFactory beanFactory;

  public void setBeanFactory(BeanFactory beanFactory) {
    this.beanFactory = beanFactory;
  }

  public void doSomethingThatRequiresNewInstance() {
    Triangle t = beanFactory.getBean("zeropoint", Triangle.class);
    // because zeropoint is defined as prototype you get a new instance everytime you call getBean(..)
  }
}
于 2012-07-11T18:11:51.060 に答える