Bahar yapılandırma dosyasında fasulye kimliği ve adı kullanma arasındaki fark


205

Spring yapılandırma dosyasındaki bir öğede idöznitelik ve nameöznitelik kullanma arasında bir fark var mı <bean>?


8
bu kadar basit sorularla gelmek zor ve çok basit ve kapsamlı cevaplar. Harika. Teşekkürler!
Peter Perháč

Yanıtlar:


129

Kaynaktan Yay referans , 3.2.3.1 Adlandırma Fasulye :

Her fasulyenin bir veya daha fazla kimliği vardır (tanımlayıcılar veya adlar da denir; bu terimler aynı şeye işaret eder). Bu kimlikler, fasulyenin barındırdığı kap içinde benzersiz olmalıdır. Fasulye neredeyse her zaman sadece bir kimliğe sahip olacaktır, ancak bir fasulyenin birden fazla kimliği varsa, ekstra olanlar esasen takma ad olarak kabul edilebilir.

XML tabanlı yapılandırma meta verilerini kullanırken, çekirdek tanımlayıcılarını belirtmek için 'id' veya 'name' niteliklerini kullanırsınız. 'İd' özniteliği, tam olarak bir kimlik belirtmenize olanak tanır ve gerçek bir XML öğesi kimliği özniteliği olduğundan, diğer öğeler kimliğe başvurduğunda XML ayrıştırıcısı bazı ekstra doğrulama yapabilir; bu nedenle, bir fasulye kimliği belirtmenin tercih edilen yoludur. Ancak, XML belirtimi, XML kimliklerinde yasal olan karakterleri sınırlandırmaz. Bu genellikle bir kısıtlama değildir, ancak bu özel XML karakterlerinden birini kullanmaya ihtiyacınız varsa veya çekirdeğe başka takma adlar eklemek istiyorsanız, virgülle ayrılmış bir veya daha fazla fasulye kimliği de belirtebilirsiniz (, ), noktalı virgül (;) veya 'name' özniteliğindeki boşluktan oluşur.

Temelde idöznitelik XML kimliği öznitelik standartlarına uygundur, oysa namebiraz daha esnektir. Genel olarak, nameneredeyse sadece kullanıyorum. Daha çok "Bahar-y" gibi görünüyor.


46
Alıntı yaptığınız Bahar referansı "id" özelliğini kullanmanızı önerirken "name" özelliğini kullanmayı mı tercih edersiniz? "Name" ile yapışmayı tercih
etseniz

77

İlkbahar 3.1'den beri, idöznitelik bir xsd:stringve öznitelikle aynı karakter aralığına izin verir name.

Bir arasındaki tek fark, idve namebir yani namebir oysa bir virgül, noktalı veya boşluk ile ayrılmış birden çok takma içerebilir idtek bir değer olmalıdır.

İlkbahar 3.2 belgelerinden:

XML tabanlı yapılandırma meta verilerinde, çekirdek tanımlayıcılarını belirtmek için id ve / veya ad özniteliklerini kullanırsınız. İd özelliği, tam olarak bir kimlik belirtmenize olanak tanır. Geleneksel olarak bu adlar alfasayısaldır ('myBean', 'fooService' vb.), Ancak özel karakterler de içerebilir. Çekirdeğe başka takma adlar eklemek isterseniz, bunları virgül (,), noktalı virgül (;) veya boşlukla ayırarak ad özelliğinde de belirtebilirsiniz. Tarihsel bir not olarak, Bahar 3.1'den önceki sürümlerde, id niteliği, olası karakterleri kısıtlayan bir xsd: ID olarak yazılmıştır. 3.1 itibariyle, şimdi xsd: string. Fasulye kimliği benzersizliğinin kapsayıcı tarafından yine de uygulandığını, ancak artık XML ayrıştırıcıları tarafından uygulanmadığını unutmayın.


48

İkisi de işe yarar. İhtiyaçlarınıza bağlıdır:
Fasulye tanımlayıcı örneğin ( /viewSummary.html) için özel karakterler içeriyorsa id, geçerli bir XML kimliği olmadığı için fasulye olarak izin verilmez . Bu gibi durumlarda, fasulyeyi tanımlamayı atlayabilir idve nameonun yerine fasulyeyi besleyebilirsiniz. Özellik ayrıca tanımlanmasında yardımcı olur verilen bir fasulye için birden tanımlayıcıları belirterek sağlar, çünkü senin fasulye için es.
namealias


4
Ayrıca, kendi sözlerinizle söylemek ve neden özel karakterlere ihtiyaç duyulabileceğini gösteren bir örnek vermek için.
Michael Piefel

Teşekkür ederim. Teşekkür ederim.
pugmarx

3

<bean> etiketinde id özelliği ve name özelliği kullanma arasında herhangi bir fark var mı

Birkaç küçük fark var, id kullanıldığında düzgün kullanılmazsa istisna atar.
aşağıdaki soruya cevap vereyim

Bir id niteliğini kullanma ile <bean> etiketinde ad niteliği kullanma arasında herhangi bir fark var mı ,

Fark yok. bir <bean> etiketinde id veya name kullanıldığında aynı etkiyle karşılaşırsınız.

Nasıl?

Hem id hem de name öznitelikleri bize bir çekirdeğe tanımlayıcı değer sağlamak için bir araç sağlıyor (Bu an için id'nin id anlamına gelir, ancak tanımlayıcı değil). Her iki durumda da, arama yaparsanız aynı sonucu görürsünüz applicationContext.getBean("bean-identifier"); .

<bean> etiketinin java eşdeğeri @Bean'ı alırsanız, bir kimlik özelliği bulamazsınız. tanımlayıcı değerinizi @adean'a yalnızca ad özelliği ile verebilirsiniz.

Bir örnekle açıklayayım:
Bu yapılandırma dosyasını alın, onu spring1.xml olarak adlandıralım

<?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>

Bahar, Foo nesnesini için döndürür Foo f = (Foo) context.getBean("foo"); . Yukarıdaki spring1.xml id="foo"ile değiştirin name="foo", yine de aynı sonucu göreceksiniz.

Xml yapılandırmanızı aşağıdaki gibi tanımlayın:

<?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 alacaksınız. Şunu söyleyecektir, Bean öğesi 'fooIdentifier' bu öğede zaten kullanılıyor. Bu arada, config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com altında olup olmadığınızı göreceksiniz. intertech.Foo "> </bean>


Fasulye etiketine hem id hem de isim koyarsanız, fasulyenin 2 tanımlayıcısı olduğu söylenir. herhangi bir tanımlayıcı ile aynı fasulyeyi alabilirsiniz. yapılandırmayı şu şekilde al

<?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>

aşağıdaki kod doğru yazdırılıyor

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

ApplicationContext xml dosyasında Id ve name tanımlamasında fark var mı? Hayır 3.1 (yay) itibarıyla id, xsd: string türü olarak da tanımlanır. Bu, Kimlik tanımında ad tanımlanmasına izin verilen karakterlere de izin verildiği anlamına gelir. Bu, Bahar 3.1'den önce mümkün değildi.

Neden Id ile aynı olduğunda adı kullanmalıyım? Bir uygulamadaki her bileşenin, söz konusu bileşenin kendisine özgü bir fasulye adı kullanarak ortak bir bağımlılığa başvurmasına izin vermek gibi bazı durumlar için yararlıdır.

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" />

0

Hem idve nameSpring IOC kap / ApplicationContecxt bean belirleyicileridir. idÖzniteliği tam olarak bir id ancak kullanarak belirtmenizi sağlar nameo fasulye için takma ad verebilirsiniz özellik.

Bahar doktorunu buradan kontrol edebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.