Bộ sưu tập

Sử dụng từ khóa “abstract” trong việc khai báo các thành phần trong Spring


https://codersontrang.com/2013/02/15/su-dung-tu-khoa-abstract-trong-viec-khai-bao-cac-thanh-phan-trong-spring/

Từ khóa “abstract” được sử dụng ở rất nhiều các ngôn ngữ lập trình khác nhau. Mỗi một ngôn ngữ sử dụng từ khóa này với mục đích khác nhau. Trong Java là ngôn ngữ lập trình hướng đối tượng, từ abstract đặt trước khai báo của một lớp biểu thị rằng lớp đó bao gồm các thuộc tính chung và sẽ được kế thừa bởi các lớp khác. Tư tưởng sử dụng từ khóa abstract trong việc khai báo các thành phần trong Spring cũng tương tự như vậy. Khi một bean là abstract, nó sẽ chứa các thuộc tính chung và thông tin liên kết cho các thuộc tính này, abstract bean sẽ được kế thừa bởi các bean khác, các bean khác sẽ thừa hưởng lại cách cấu hình của các thuộc tính được khai báo trong abstract bean. Để khai báo một bean là abstract, chúng ta chỉ đơn giản thêm thuộc tính abstract="true" vào khai báo của bean đó. Thuộc tính parent được sử dụng trong khai báo của một bean để chỉ ra bean đó sẽ được kế thừa từ bean nào. Ta có thể dùng từ khóa abstract trong Spring theo hai trường hợp đặc trưng sau:

1. Dùng trong trường hợp các bean kế thừa có chung kiểu

 
 <bean id="property1" class="com.wordpress.codersontrang.Property1"/>  
 <bean id="property2" class="com.wordpress.codersontrang.Property2"/>  
 
 <bean id="baseBean" class="com.wordpress.codersontrang.BaseBean" abstract="true" >  
      <property name="property1" ref="property1"/>  
      <property name="property2" ref="property2"/>  
 </bean>  
 
 <bean id="childBean1" parent="baseBean"/>  
 <bean id="childBean2" parent="baseBean"/>  
  • Một khi chỉ ra baseBean là abstract, chúng ta không thể sử dụng cơ chế autowire đối với bean này. Nguyên nhân là khi một bean là abstract, nó sẽ bị bỏ qua và không được khởi tạo thành đối tượng bởi Spring container.
  • Trong trường hợp trên, baseBean không nhất thiết phải là abstract, các bean khác hoàn toàn có thể kế thừa từ nó. Tất nhiên là khi đó, ta lại hoàn toàn có thể sự dụng các cơ chế autowire đối với baseBean
  • Vì ta đã chỉ ra kiểu của baseBean (com.wordpress.codersontrang.BaseBean), nên sẽ không cần phải chỉ ra kiểu của các bean kế thừa nó. Chính vì thế mà childBean1, childBean2 trong trường hợp trên không cần chỉ ra thuộc tính class trong khai báo của chúng

2. Dùng trong trường hợp các bean kế thừa không có chung kiểu


 <bean id="property1" class="com.wordpress.codersontrang.Property1"/>  
 <bean id="property2" class="com.wordpress.codersontrang.Property2"/>  

 <bean id="baseBean" abstract="true" >  
      <property name="property1" ref="property1"/>  
      <property name="property2" ref="property2"/>  
 </bean>  

 <bean id="childBean1" parent="baseBean" class="com.wordpress.codersontrang.ChildBean1"/>  
 <bean id="childBean2" parent="baseBean" class="com.wordpress.codersontrang.ChildBean2"/>  
  • baseBean không có kiểu, cho nên bắt buộc nó phải là abstract
  • Phải chỉ ra kiểu của các bean kế thừa baseBean (childBean1, childBean2)
  • childBean1, childBean2 là các bean cùng kế thừa baseBean, cùng có chung hai thuộc tính là property1property2 nhưng chúng có kiểu hoàn toàn khác nhau. Đặc điểm này của Spring phá vỡ sự giới hạn trong tư tưởng của lập trình hướng đối tượng. Ở đây sự kế thừa còn có thể xuất hiện trên các bean có kiểu hoàn toàn khác nhau (chỉ cần các bean có chung một tập hợp các thuộc tính nào đó), là cái mà lập trình hướng đối tượng đơn thuần không thể có được.

Việc sử dụng từ khóa abstract là rất hữu ích cho việc rút gọn việc khai báo các bean. Giả sử trong trường hợp trên, ta phải khởi tạo cả vài chục bean cùng có chung thuộc tính là property1property2, nếu không sử dụng từ khóa abstract, ta sẽ phải viết lặp đi lặp lại để liên kết các thuộc tính này trong các bean vài chục lần. Rồi sau này muốn sửa cũng phải sửa ở vài chục chỗ. Như vậy là dư thừa và rất tốn công sức. Bằng việc khéo léo sử dụng từ khóa abstract, tất cả mọi thứ trở nên dễ dàng, ngắn gọn và trong sáng hơn rất nhiều.

Good luck!

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s