Có sự khác biệt nào giữa việc sử dụng một id
thuộc tính và name
thuộc tính trên một thành <bean>
phần trong tệp cấu hình Spring không?
Có sự khác biệt nào giữa việc sử dụng một id
thuộc tính và name
thuộc tính trên một thành <bean>
phần trong tệp cấu hình Spring không?
Câu trả lời:
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, id
thuộc tính tuân thủ các tiêu chuẩn thuộc tính id XML trong khi name
linh hoạt hơn một chút. Nói chung, tôi sử dụng name
khá nhiều độc quyền. Có vẻ như "Mùa xuân-y" hơn.
Kể từ Spring 3.1, id
thuộc tính là một xsd:string
và cho phép phạm vi ký tự giống như name
thuộc tính.
Sự khác biệt duy nhất giữa id
a và a name
là a name
có 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 đó id
phả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.
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 id
và cung cấp hạt name
thay thế.
Các name
thuộc tính cũng giúp trong việc xác định alias
es 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.
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 id và sử 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
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" />
Cả hai id
và name
là định danh bean trong Spring IOC container / ApplicationContecxt. Các id
thuộc tính cho phép bạn xác định chính xác một id nhưng sử dụng name
thuộ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.