Sự khác nhau giữa việc sử dụng bean id và tên trong tệp cấu hình Spring


205

Có sự khác biệt nào giữa việc sử dụng một idthuộc tính và namethuộc tính trên một thành <bean>phần trong tệp cấu hình Spring không?


8
thật khó để có được câu hỏi này đơn giản và câu trả lời rất đơn giản và toàn diện. Tuyệt quá. Cảm ơn!
Peter Perháč

Câu trả lời:


129

Từ tài liệu tham khảo Mùa xuân , 3.2.3.1 Đặt tên Đậu :

Mỗi bean có một hoặc nhiều id (còn được gọi là định danh hoặc tên; các thuật ngữ này đề cập đến cùng một điều). Các id này phải là duy nhất trong vùng chứa mà bean được lưu trữ. Một bean hầu như sẽ luôn chỉ có một id, nhưng nếu một bean có nhiều hơn một id, thì các id thêm về cơ bản có thể được coi là bí danh.

Khi sử dụng siêu dữ liệu cấu hình dựa trên XML, bạn sử dụng các thuộc tính 'id' hoặc 'name' để chỉ định (các) định danh bean. Thuộc tính 'id' cho phép bạn chỉ định chính xác một id và vì đây là thuộc tính ID phần tử XML thực, trình phân tích cú pháp XML có thể thực hiện một số xác thực bổ sung khi các phần tử khác tham chiếu id; như vậy, đó là cách ưa thích để chỉ định id bean. Tuy nhiên, đặc tả XML không giới hạn các ký tự hợp pháp trong ID XML. Đây thường không phải là một ràng buộc, nhưng nếu bạn có nhu cầu sử dụng một trong các ký tự XML đặc biệt này hoặc muốn giới thiệu các bí danh khác cho bean, bạn cũng có thể hoặc thay vào đó chỉ định một hoặc nhiều id bean, được phân tách bằng dấu phẩy (, ), dấu chấm phẩy (;) hoặc khoảng trắng trong thuộc tính 'name'.

Vì vậy, về cơ bản, idthuộc tính tuân thủ các tiêu chuẩn thuộc tính id XML trong khi namelinh hoạt hơn một chút. Nói chung, tôi sử dụng namekhá nhiều độc quyền. Có vẻ như "Mùa xuân-y" hơn.


46
Bạn thích sử dụng thuộc tính "name" mặc dù tham chiếu Spring mà bạn đã trích dẫn khuyến nghị sử dụng thuộc tính "id"? Ngay cả khi bạn thích gắn bó với "tên", bạn không thể gọi nó là "Spring-y" nếu tham chiếu Mùa xuân gợi ý khác :) Đây là nitpicky, tôi biết;)
theadam

77

Kể từ Spring 3.1, idthuộc tính là một xsd:stringvà cho phép phạm vi ký tự giống như namethuộc tính.

Sự khác biệt duy nhất giữa ida và a namelà a namecó thể chứa nhiều bí danh được phân tách bằng dấu phẩy, dấu chấm phẩy hoặc khoảng trắng, trong khi đó idphải là một giá trị duy nhất.

Từ tài liệu Spring 3.2:

Trong siêu dữ liệu cấu hình dựa trên XML, bạn sử dụng các thuộc tính id và / hoặc tên để chỉ định (các) định danh bean. Thuộc tính id cho phép bạn chỉ định chính xác một id. Thông thường những tên này là chữ và số ('myBean', 'fooService', v.v.), nhưng cũng có thể là các ký tự đặc biệt. Nếu bạn muốn giới thiệu các bí danh khác cho bean, bạn cũng có thể chỉ định chúng trong thuộc tính name, được phân tách bằng dấu phẩy (,), dấu chấm phẩy (;) hoặc khoảng trắng. Như một ghi chú lịch sử, trong các phiên bản trước Mùa xuân 3.1, thuộc tính id được nhập dưới dạng xsd: ID, ràng buộc các ký tự có thể. Kể từ 3.1, bây giờ là xsd: chuỗi. Lưu ý rằng tính duy nhất của bean id vẫn được thi hành bởi bộ chứa, mặc dù không còn bởi các trình phân tích cú pháp XML.


48

Một trong hai sẽ làm việc. Nó phụ thuộc vào nhu cầu của bạn:
Nếu số nhận dạng bean của bạn chứa (các) ký tự đặc biệt chẳng hạn ( /viewSummary.html), thì nó sẽ không được phép là bean id, bởi vì đó không phải là ID XML hợp lệ. Trong những trường hợp như vậy, bạn có thể bỏ qua việc xác định hạt idvà cung cấp hạt namethay thế.
Các namethuộc tính cũng giúp trong việc xác định aliases cho đậu của bạn, vì nó cho phép xác định nhiều định danh cho một bean nhất định.


4
Thêm một câu nói bằng lời của bạn và đưa ra một ví dụ tại sao có thể cần các ký tự đặc biệt.
Michael Piefel

Cảm ơn bạn. Cảm kích điều đó.
pugmarx

3

Có sự khác biệt nào giữa việc sử dụng thuộc tính id và thuộc tính name trên thẻ <bean>

Vài sự khác biệt nhỏ tồn tại như thế, sử dụng id sẽ ném ngoại lệ nếu không được xử lý đúng cách.
hãy để tôi trả lời câu hỏi dưới đây

Có sự khác biệt nào giữa việc sử dụng thuộc tính idsử dụng thuộc tính name trên thẻ <bean> không,

Không có sự khác biệt. bạn sẽ gặp hiệu ứng tương tự khi id hoặc tên được sử dụng trên thẻ <bean>.

Làm sao?

Cả hai thuộc tính id và name đều cung cấp cho chúng ta một phương tiện để cung cấp giá trị định danh cho một bean (Đối với thời điểm này, think id có nghĩa là id nhưng không phải là định danh). Trong cả hai trường hợp, bạn sẽ thấy kết quả tương tự nếu bạn gọi applicationContext.getBean("bean-identifier"); .

Lấy @Bean, tương đương java của thẻ <bean>, bạn sẽ không tìm thấy thuộc tính id. bạn chỉ có thể cung cấp giá trị định danh cho @Bean thông qua thuộc tính name.

Hãy để tôi giải thích nó thông qua một ví dụ:
Lấy tệp cấu hình này, hãy gọi nó là 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 trả về đối tượng Foo cho Foo f = (Foo) context.getBean("foo"); . Thay thế id="foo"bằng name="foo"trong spring1.xml ở trên, Bạn vẫn sẽ thấy kết quả tương tự.

Xác định cấu hình xml của bạn như thế nào,

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

Bạn sẽ nhận được BeanDefDefParsingException. Nó sẽ nói, tên Bean 'fooIdentifier' đã được sử dụng trong phần tử này. Nhân tiện, đây là ngoại lệ tương tự bạn sẽ thấy nếu bạn có bên dưới config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </ bean>


Nếu bạn giữ cả id và tên cho thẻ bean, bean được cho là có 2 định danh. bạn có thể nhận được cùng một bean với bất kỳ định danh. lấy cấu hình làm

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

đoạn mã sau in đúng

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

Có sự khác biệt trong việc xác định Id & name trong ApplicationContext xml không? Không kể từ 3.1 (mùa xuân), id cũng được định nghĩa là loại xsd: chuỗi. Nó có nghĩa là bất cứ ký tự nào được phép trong việc xác định tên cũng được cho phép trong Id. Điều này là không thể trước mùa xuân 3.1.

Tại sao phải sử dụng tên khi nó giống như Id? Nó rất hữu ích cho một số tình huống, chẳng hạn như cho phép mỗi thành phần trong ứng dụng tham chiếu đến một phụ thuộc chung bằng cách sử dụng tên bean dành riêng cho chính thành phần đó.

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

Cả hai idnamelà định danh bean trong Spring IOC container / ApplicationContecxt. Các idthuộc tính cho phép bạn xác định chính xác một id nhưng sử dụng namethuộc tính bạn có thể cho biết tên bí danh để đậu đó.

Bạn có thể kiểm tra tài liệu mùa xuân ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.