web-dev-qa-db-ja.com

Spring構成ファイルでのBean IDと名前の使用の違い

Spring構成ファイルの<bean>要素でid属性とname属性を使用するのに違いはありますか?

196
Bear Bibeaults

Spring reference.2.3.1 Naming Beans から:

すべてのBeanには1つ以上のID(識別子、または名前とも呼ばれます。これらの用語は同じものを指します)があります。これらのIDは、Beanがホストされているコンテナ内で一意である必要があります。Beanにはほとんどの場合1つのIDしかありませんが、Beanに複数のIDがある場合、余分なIDは基本的にエイリアスと見なすことができます。

XMLベースの構成メタデータを使用する場合、「id」または「name」属性を使用してBean識別子を指定します。 'id'属性を使用すると、正確に1つのIDを指定できます。これは実際のXML要素ID属性であるため、XMLパーサーは他の要素がidを参照するときに追加の検証を実行できます。そのため、Bean IDを指定するのに好ましい方法です。ただし、XML仕様では、XML IDで有効な文字が制限されています。通常、これは制約ではありませんが、これらの特殊なXML文字のいずれかを使用する必要がある場合、またはBeanに他のエイリアスを導入する場合、カンマで区切られた1つ以上のBean IDを指定することもできます(、 )、セミコロン(;)、または 'name'属性の空白。

したがって、基本的にid属性はXML id属性標準に準拠しますが、nameはもう少し柔軟です。一般的に、私はnameをほとんど排他的に使用します。単なる「春-y」のようです。

128
cletus

Spring 3.1以降、id属性はxsd:stringであり、name属性と同じ範囲の文字を使用できます。

idnameの唯一の違いは、nameにはコンマ、セミコロン、または空白で区切られた複数のエイリアスを含めることができますが、idは単一の値でなければならないことです。 。

Spring 3.2ドキュメントから:

XMLベースの構成メタデータでは、idおよび/またはname属性を使用して、Bean識別子を指定します。 id属性を使用すると、IDを1つだけ指定できます。通常、これらの名前は英数字(「myBean」、「fooService」など)ですが、特殊文字も使用できます。 Beanに他のエイリアスを導入する場合は、name属性でコンマ(、)、セミコロン(;)、または空白で区切って指定することもできます。 歴史的なメモとして、Spring 3.1より前のバージョンでは、id属性はxsd:IDとして入力され、可能な文字を制限していました。3.1の時点では、xsd:stringになっています。コンテナによって強制されますが、XMLパーサーによって強制されなくなりました。

76
Duncan Jones

どちらかが動作します。それはあなたのニーズ次第です:
Bean識別子に(/viewSummary.html)などの特殊文字が含まれる場合、Bean idとして許可されません。これは有効なXML IDではないためです。このような場合、Bean idの定義をスキップして、代わりにBean nameを指定できます。
name属性は、特定のBeanに複数の識別子を指定できるため、Beanのaliasesの定義にも役立ちます。

46
pugmarx

ApplicationContext xmlでIDと名前の定義に違いはありますか?いいえ3.1(spring)現在、idはxsd:stringタイプとしても定義されています。これは、名前の定義で許可されている文字はすべて、IDでも許可されていることを意味します。これは、Spring 3.1以前では不可能でした。

Idと同じ名前を使用する理由アプリケーション内の各コンポーネントがそのコンポーネント自体に固有のBean名を使用して共通の依存関係を参照できるようにするなど、いくつかの状況で役立ちます。

For example, the configuration metadata for subsystem A may refer to a DataSource via the name subsystemA-dataSource. The configuration metadata for subsystem B may refer to a DataSource via the name subsystemB-dataSource. When composing the main application that uses both these subsystems the main application refers to the DataSource via the name myApp-dataSource. To have all three names refer to the same object you add to the MyApp configuration metadata the following 

<bean id="myApp-dataSource" name="subsystemA-dataSource,subsystemB-dataSource" ..../>

Alternatively, You can have separate xml configuration files for each sub-system and then you can make use of
alias to define your own names.

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />
1
user3202413

<bean>タグでid属性とname属性を使用するのに違いはありますか

Idを使用すると、適切に処理されない場合に例外がスローされるなど、わずかな違いがほとんどありません。
質問の下に答えさせてください

<bean>タグのidを使用属性とnameを使用属性に違いはありますか?

違いはありません。 <bean>タグでidまたはnameが使用されている場合も同じ効果があります。

どうやって?

Idとnameの両方の属性は、特定のBeanに識別子を提供する手段を提供しています(現時点では、idはidを意味しますが、識別子としてではありません)任意の属性を選択して、識別子の値を提供できます。どちらの場合でも、applicationContext.getBean("bean-identifier");を呼び出すと同じ結果が表示されます。

<Bean>タグに相当するJavaである@Beanを使用します。id属性はありません。 name属性を介してのみ識別子値を指定できます。

例で説明し、Beanを取得するための次のコードを考えてみましょう。

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...); Foo f = (Foo) context.getBean("foo")// returns Foo object;
構成が次のように提供されている場合
spring1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="foo" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

Springは、Foo f = (Foo) context.getBean("foo");のFooオブジェクトを返します

上記のspring1.xmlでid="foo"name="foo"に置き換えます

あなたはまだ同じ結果を見ることができます、
Springは、Foo f = (Foo) context.getBean("foo");のFooオブジェクトを返します

次のようなxml構成を定義します。

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="fooIdentifier" class="com.intertech.Foo"></bean>
  <bean name="fooIdentifier" class="com.intertech.Foo"></bean>
</beans>

BeanDefinitionParsingExceptionが発生します。Bean名「fooIdentifier」はこの要素で既に使用されています。
次の場合、同じ例外がスローされます
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
は構成として渡されます

IDとBeanタグの名前の両方を保持する場合、Beanには2つの識別子があると言われ、任意の識別子で同じBeanを取得できます。として設定する

<?xml version="1.0" encoding="UTF-8"?><br>
<beans ...>
  <bean id="fooById" name="fooByName" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

次のコードはtrueを出力します

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...);
Foo fooById = (Foo) context.getBean("fooById")// returns Foo object;
Foo fooByName = (Foo) context.getBean("fooByName")// returns Foo object;
System.out.println(fooById == fooByName) //true
1
swaroop