มีความแตกต่างระหว่างการใช้แอid
ททริบิวต์และแอname
ททริบิวใน<bean>
องค์ประกอบในไฟล์การกำหนดค่าสปริงหรือไม่?
มีความแตกต่างระหว่างการใช้แอid
ททริบิวต์และแอname
ททริบิวใน<bean>
องค์ประกอบในไฟล์การกำหนดค่าสปริงหรือไม่?
คำตอบ:
จากการอ้างอิงฤดูใบไม้ผลิ , 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" มากกว่า
ตั้งแต่ Spring 3.1 id
คุณลักษณะเป็นxsd:string
และอนุญาตให้มีช่วงของอักขระเช่นเดียวกับname
แอตทริบิวต์
ความแตกต่างเพียงอย่างเดียวระหว่างid
a และ 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 อีกต่อไป
ทั้งสองจะทำงาน ขึ้นอยู่กับความต้องการของคุณ:
หากตัวระบุ bean ของคุณมีอักขระพิเศษตัวอย่างเช่น ( /viewSummary.html
) จะไม่อนุญาตให้ใช้เป็นถั่วid
เนื่องจากไม่ใช่รหัส XML ที่ถูกต้อง ในกรณีเช่นนี้คุณสามารถข้ามการกำหนดถั่วid
และจัดหาถั่วname
แทน แอตทริบิวต์นอกจากนี้ยังช่วยในการกำหนดES ถั่วของคุณเนื่องจากจะช่วยให้การระบุตัวบ่งชี้หลายถั่วให้name
alias
มีความแตกต่างระหว่างการใช้แอตทริบิวต์ 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
มีการกำหนด 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" />
ทั้งสองid
และname
เป็นตัวระบุถั่วใน Spring IOC container / ApplicationContecxt id
แอตทริบิวต์ช่วยให้คุณระบุว่าหนึ่ง ID แต่การใช้name
แอตทริบิวต์ที่คุณสามารถให้ชื่อนามแฝงที่จะถั่วที่
คุณสามารถตรวจสอบเอกสารฤดูใบไม้ผลิที่นี่