ความแตกต่างระหว่างการใช้ bean id และชื่อในไฟล์คอนฟิกูเรชัน Spring


205

มีความแตกต่างระหว่างการใช้แอidททริบิวต์และแอnameททริบิวใน<bean>องค์ประกอบในไฟล์การกำหนดค่าสปริงหรือไม่?


8
เป็นการยากที่จะถามคำถามตรงไปตรงมาและคำตอบที่ตรงไปตรงมาและครอบคลุม ยิ่งใหญ่ ขอบคุณ!
Peter Perháč

คำตอบ:


129

จากการอ้างอิงฤดูใบไม้ผลิ , 3.2.3.1 ถั่วตั้งชื่อ :

ถั่วทุกตัวมีรหัสอย่างน้อยหนึ่งรหัส (เรียกอีกอย่างว่าตัวระบุหรือชื่อ; คำเหล่านี้อ้างถึงสิ่งเดียวกัน) รหัสเหล่านี้จะต้องไม่ซ้ำกันภายในคอนเทนเนอร์ที่โฮสต์อยู่ในถั่วถั่วเกือบจะมีเพียงหนึ่ง id เท่านั้น แต่ถ้าถั่วมีมากกว่าหนึ่ง id คนพิเศษสามารถพิจารณานามแฝงเป็นหลัก

เมื่อใช้เมทาดาทาการกำหนดค่าที่ยึดตาม XML คุณใช้แอตทริบิวต์ 'id' หรือ 'name' เพื่อระบุตัวระบุถั่ว แอตทริบิวต์ 'id' ช่วยให้คุณสามารถระบุ ID เดียวและเป็นแอตทริบิวต์ ID องค์ประกอบ XML จริงตัวแยกวิเคราะห์ XML สามารถทำการตรวจสอบพิเศษบางอย่างเมื่อองค์ประกอบอื่น ๆ อ้างอิง id; เช่นนี้เป็นวิธีที่ต้องการในการระบุ bean id อย่างไรก็ตามข้อมูลจำเพาะ XML จะ จำกัด อักขระที่ถูกกฎหมายใน XML ID นี่ไม่ใช่ข้อ จำกัด แต่ถ้าคุณต้องการใช้หนึ่งในอักขระ XML พิเศษเหล่านี้หรือต้องการแนะนำนามแฝงอื่น ๆ ให้กับ bean คุณอาจระบุหรือไม่ก็ระบุรหัสถั่วอย่างน้อยหนึ่งรายการโดยคั่นด้วยเครื่องหมายจุลภาค (, ), อัฒภาค (;) หรือช่องว่างในแอตทริบิวต์ 'name'

ดังนั้นโดยทั่วไปแล้วidแอตทริบิวต์นั้นเป็นไปตามมาตรฐานแอตทริบิวต์ XML id ในขณะที่nameยืดหยุ่นกว่าเล็กน้อย โดยทั่วไปแล้วฉันใช้งานnameค่อนข้างพิเศษ ดูเหมือนว่า "Spring-y" มากกว่า


46
คุณต้องการใช้แอตทริบิวต์ "name" แม้ว่าสปริงอ้างอิงที่คุณอ้างถึงแนะนำโดยใช้แอตทริบิวต์ "id" หรือไม่ แม้ว่าคุณจะชอบติดอยู่กับ "ชื่อ" คุณก็ไม่สามารถเรียกมันได้อีกว่า "Spring-y" ถ้าการอ้างอิงในฤดูใบไม้ผลิแนะนำเป็นอย่างอื่น :) นี่คือ nitpicky ฉันรู้;)
theadam

77

ตั้งแต่ Spring 3.1 idคุณลักษณะเป็นxsd:stringและอนุญาตให้มีช่วงของอักขระเช่นเดียวกับnameแอตทริบิวต์

ความแตกต่างเพียงอย่างเดียวระหว่างida และ a nameคือ a nameสามารถมีหลายชื่อแทนโดยคั่นด้วยเครื่องหมายจุลภาค, อัฒภาคหรือช่องว่างในขณะที่idจะต้องเป็นค่าเดียว

จากเอกสาร Spring 3.2:

ในข้อมูลเมตาของการกำหนดค่าที่ใช้ XML คุณใช้แอตทริบิวต์ id และ / หรือชื่อเพื่อระบุตัวระบุถั่ว แอตทริบิวต์ id ช่วยให้คุณระบุรหัสได้หนึ่งรายการ โดยทั่วไปชื่อเหล่านี้เป็นตัวอักษรและตัวเลข ('myBean', 'fooService' ฯลฯ ) แต่อาจมีอักขระพิเศษเช่นกัน หากคุณต้องการแนะนำนามแฝงอื่น ๆ ให้กับ bean คุณสามารถระบุได้ในแอตทริบิวต์ name คั่นด้วยเครื่องหมายจุลภาค (,), เครื่องหมายอัฒภาค (;) หรือช่องว่างสีขาว ในฐานะที่เป็นบันทึกประวัติศาสตร์ในรุ่นก่อนฤดูใบไม้ผลิ 3.1 แอตทริบิวต์ id ถูกพิมพ์เป็น xsd: ID ซึ่งมีอักขระ จำกัด ณ 3.1 ตอนนี้มันเป็น xsd: string โปรดทราบว่าเอกลักษณ์ของ bean id นั้นยังคงมีการบังคับใช้โดยคอนเทนเนอร์แม้ว่าจะไม่มีตัวแยกวิเคราะห์ XML อีกต่อไป


48

ทั้งสองจะทำงาน ขึ้นอยู่กับความต้องการของคุณ:
หากตัวระบุ bean ของคุณมีอักขระพิเศษตัวอย่างเช่น ( /viewSummary.html) จะไม่อนุญาตให้ใช้เป็นถั่วidเนื่องจากไม่ใช่รหัส XML ที่ถูกต้อง ในกรณีเช่นนี้คุณสามารถข้ามการกำหนดถั่วidและจัดหาถั่วnameแทน แอตทริบิวต์นอกจากนี้ยังช่วยในการกำหนดES ถั่วของคุณเนื่องจากจะช่วยให้การระบุตัวบ่งชี้หลายถั่วให้
namealias


4
บวกหนึ่งสำหรับการพูดในคำพูดของคุณและให้ตัวอย่างว่าทำไมตัวละครพิเศษอาจจำเป็น
Michael Piefel

ขอบคุณ. ขอบคุณมัน
pugmarx

3

มีความแตกต่างระหว่างการใช้แอตทริบิวต์ id และแอตทริบิวต์ name ในแท็ก <bean>

มีความแตกต่างเล็กน้อยบางประการเช่นการใช้รหัสจะมีข้อยกเว้นหากไม่ได้รับการจัดการอย่างเหมาะสม
ให้ฉันตอบคำถามด้านล่าง

มีความแตกต่างระหว่างการใช้แอตทริบิวต์idและการใช้แอตทริบิวต์nameบนแท็ก <bean> หรือไม่

ไม่มีความแตกต่าง คุณจะได้รับผลกระทบแบบเดียวกันเมื่อใช้รหัสหรือชื่อในแท็ก <bean>

อย่างไร?

ทั้งแอตทริบิวต์ id และชื่อทำให้เรามีวิธีในการระบุค่าตัวระบุให้แก่ถั่ว (ในขณะนี้คิดว่า id หมายถึง id แต่ไม่ใช่ตัวระบุ) applicationContext.getBean("bean-identifier"); ในทั้งสองกรณีที่คุณจะเห็นผลเหมือนกันถ้าคุณโทร

ใช้ @Bean เทียบเท่ากับ java ของแท็ก <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>

ฤดูใบไม้ผลิผลตอบแทนวัตถุ Foo Foo f = (Foo) context.getBean("foo"); สำหรับ แทนที่id="foo"ด้วยname="foo"ใน spring1.xml ด้านบนคุณจะยังคงเห็นผลลัพธ์เดียวกัน

กำหนดการกำหนดค่า 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 มันจะบอกว่าชื่อถั่ว 'fooIdentifier' ถูกใช้ไปแล้วในองค์ประกอบนี้ โดยวิธีนี้เป็นข้อยกเว้นเดียวกันคุณจะเห็นว่าคุณมี config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com ด้านล่าง intertech.Foo "> </bean>


หากคุณเก็บทั้ง id และชื่อไว้ในแท็ก bean ถั่วนั้นถูกบอกว่ามีตัวระบุ 2 ตัว คุณสามารถรับ bean เดียวกันกับตัวระบุใด ๆ ใช้ config เป็น

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

รหัสต่อไปนี้พิมพ์จริง

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

มีการกำหนด ID และชื่อแตกต่างกันใน ApplicationContext xml หรือไม่ ไม่ใช่ตั้งแต่ 3.1 (สปริง) id ถูกนิยามเป็น xsd: string type มันหมายความว่าตัวละครที่ได้รับอนุญาตในการกำหนดชื่อจะได้รับอนุญาตใน Id เรื่องนี้เป็นไปไม่ได้ก่อนฤดูใบไม้ผลิ 3.1

เหตุใดจึงต้องใช้ชื่อเมื่อมันเป็นเช่นเดียวกับรหัส? มันมีประโยชน์สำหรับบางสถานการณ์เช่นการอนุญาตให้แต่ละองค์ประกอบในแอปพลิเคชันอ้างอิงถึงการพึ่งพาทั่วไปโดยใช้ชื่อถั่วที่เฉพาะเจาะจงกับองค์ประกอบนั้น

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

ทั้งสองidและnameเป็นตัวระบุถั่วใน Spring IOC container / ApplicationContecxt idแอตทริบิวต์ช่วยให้คุณระบุว่าหนึ่ง ID แต่การใช้nameแอตทริบิวต์ที่คุณสามารถให้ชื่อนามแฝงที่จะถั่วที่

คุณสามารถตรวจสอบเอกสารฤดูใบไม้ผลิที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.