16

同じクラスの 2 つの Bean を定義していて、スコープを与えていない場合。次に、作成されるクラスのインスタンスの数。例えば

applicationContext.xml で

<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>
4

3 に答える 3

12

Spring はそのタイプの 2 つの Bean を作成com.test.Exampleし、自動配線はタイプまたはメソッド名 (または修飾子) 用になります。Spring IOCを参照してください。

この簡単なテストを参照してください。

このクラスで

public static class TestBean {
    static int INT = 1;
    public int test;
    public TestBean() {
        test = INT++;
    }


}

設定 XML:

<bean name="testBean" class="com.test.TestBean"/>
<bean name="myBean" class="com.test.TestBean"/>

JUnit4 とスプリング コンテナー テスト:

@Resource
TestBean testBean;

@Resource
TestBean myBean;

@Test
public void test() {

    assertNotNull(testBean);
    assertNotNull(myBean);
    assertFalse(testBean == myBean);
    assertFalse(testBean.test == myBean.test);
}

ご覧のとおり、このテストは失敗しません。TestBean タイプの 2 つの Bean が作成されます。

Spring Doc のこの部分を参照してください。

byName
プロパティ名による自動配線。Spring は、オートワイヤーが必要なプロパティと同じ名前の Bean を探します。たとえば、Bean 定義が名前で autowire に設定されていて、マスター プロパティが含まれている (つまり、setMaster(..) メソッドがある) 場合、Spring は master という名前の Bean 定義を探し、それを使用して財産。

byType
プロパティ タイプの Bean がコンテナに 1 つだけ存在する場合、プロパティを自動配線できます。複数存在する場合、致命的な例外がスローされます。これは、その Bean に対して byType オートワイヤリングを使用できないことを示します。一致する Bean がない場合、何も起こりません。プロパティが設定されていません。

constructor
byType に似ていますが、コンストラクターの引数に適用されます。コンテナー内にコンストラクター引数タイプの Bean が 1 つだけ存在しない場合、致命的なエラーが発生します。

于 2013-10-11T18:17:17.930 に答える
0

このシナリオでは、Spring は 2 つのインスタンスを作成します。Spring コンテナーは、Bean 定義ごとにシングルトン インスタンスを作成します。

getContext.getBean("testBean") を呼び出すと、常に testBean Bean 定義の同じインスタンスが提供されます

getContext.getBean("myBean") を呼び出すと、常に myBean Bean 定義の同じインスタンスが提供されます。

于 2014-11-05T13:00:37.733 に答える