回答:
Springリファレンスから、3.2.3.1 Beanの命名:
すべてのBeanには1つ以上のID(識別子または名前とも呼ばれます。これらの用語は同じものを指します)があります。これらのIDは、Beanがホストされているコンテナー内で一意である必要があります。Beanにはほとんど常に1つのIDしかありませんが、Beanに複数のIDがある場合、余分なIDは基本的にエイリアスと見なすことができます。
XMLベースの構成メタデータを使用する場合、「id」または「name」属性を使用して、Bean識別子を指定します。'id'属性を使用すると、IDを1つだけ指定できます。これは実際のXML要素ID属性なので、他の要素がIDを参照する場合、XMLパーサーは追加の検証を実行できます。そのため、Bean IDを指定するための推奨される方法です。ただし、XML仕様では、XML IDで有効な文字が制限されています。これは通常制約ではありませんが、これらの特殊なXML文字のいずれかを使用する必要がある場合、またはBeanに他のエイリアスを導入したい場合は、コンマ(、 )、セミコロン(;)、または 'name'属性の空白。
したがって、基本的にid
属性はXML id属性標準に準拠しますname
が、もう少し柔軟です。一般的に言って、私はname
ほとんど独占的に使用しています。それはもっと「春らしい」ようです。
Spring 3.1以降、id
属性はでxsd:string
あり、属性と同じ範囲の文字を使用できname
ます。
an id
とa の唯一の違いname
は、a name
がコンマ、セミコロン、または空白で区切られた複数のエイリアスを含むことができるのに対し、id
aは単一の値でなければならないことです。
Spring 3.2のドキュメントから:
XMLベースの構成メタデータでは、id属性またはname属性、あるいはその両方を使用して、Bean識別子を指定します。id属性を使用すると、IDを1つだけ指定できます。通常、これらの名前は英数字(「myBean」、「fooService」など)ですが、特殊文字も使用できます。Beanに他のエイリアスを導入する場合は、カンマ(、)、セミコロン(;)、または空白で区切って、name属性でエイリアスを指定することもできます。歴史的なメモとして、Spring 3.1より前のバージョンでは、id属性はxsd:IDとして入力されていたため、可能な文字が制限されていました。3.1以降、現在はxsd:stringです。Bean IDの一意性は、XMLパーサーではなくコンテナによって適用されます。
どちらでも機能します。ニーズによって異なり
ます。Bean識別子に(/viewSummary.html
)などの特殊文字が含まれている場合id
、有効なXML IDではないため、Beanとして許可されません。そのような場合は、Beanの定義をスキップしてid
、name
代わりにBean を提供できます。
このname
属性alias
は、特定のBeanに複数の識別子を指定できるため、Beanのesの定義にも役立ちます。
<bean>タグでのid属性とname属性の使用に違いはありますか
のような小さな違いはほとんどありません。idを使用すると、適切に処理されないと例外がスローされます。
以下の質問にお答えさせてください
<bean>タグでid属性を使用することとname属性を使用することの間に違いはありますか、
違いはありません。<bean>タグでIDまたは名前が使用されている場合も、同じ効果が得られます。
どうやって?
id属性とname属性の両方が、BeanにID値を提供する手段を提供しています(現時点では、IDはIDを意味し、IDは意味しないと考えてください)。どちらの場合も、を呼び出すと同じ結果になりますapplicationContext.getBean("bean-identifier");
。
Javaの<bean>タグに相当する@Beanを取ると、id属性が見つかりません。名前属性を介してのみ識別子値を@Beanに与えることができます。
例を挙げて説明し
ます。この構成ファイルを取り、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オブジェクトを返しますFoo f = (Foo) context.getBean("foo");
。上記のspring1.xmlでに置き換えid="foo"
てname="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'はこの要素ですでに使用されています。ちなみに、これは、config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" class = "comの下にある場合と同じ例外です 。 intertech.Foo "> </ bean>
BeanタグのIDと名前の両方を保持する場合、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
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" />