Trong hướng dẫn này, chúng ta sẽ tìm hiểu về @Order annotation của Spring được dùng để sắp xếp thứ tự của một component hoặc bean trong Spring.
@Order có một tham số đầu vào dùng để chỉ định thứ tự của một component. Mặc định giá trị này sẽ là Ordered.LOWEST_PRECEDENCE. Nó sẽ đánh dấu một component có độ ưu tiên thấp so với tất cả các component được chú thích @Order khác.
Tương tự, giá trị Ordered.HIGHEST_PRECEDENCE có thể sử dụng để đánh dấu một component có độ ưu tiên cao hơn so với các component được sắp xếp khác.
Khi nào sử dụng @Order annotation
Trước phiên bảng Spring 4.0, @Order annotation chỉ được sủ dụng cho các lệnh thực thi AspectJ. Kể từ Spring 4.0, nó đã hỗ trợ cho cả việc injection các component và collection. Kết qủa là spring đã tiêm các bean có cùng kiểu dữ liệu dựa trên thứ tự được định nghĩa trong @Order.
Giả sử mình có một Rating interface.
public interface Rating { int getRating(); }
Và 3 implementation triển khai từ Rating interface.
@Component @Order(1) public class Excellent implements Rating { @Override public int getRating() { return 1; } } @Component @Order(2) public class Good implements Rating { @Override public int getRating() { return 2; } } @Component @Order(Ordered.LOWEST_PRECEDENCE) public class Average implements Rating { @Override public int getRating() { return 3; } }
Trong đó class Average sẽ có độ ưu tiên thấp nhất vì gía trị của nó là LOWEST_PRECEDENCE.
Để kiểm tra thứ tự của các component được tạo chúng ta có thể viết một unit-test đơn giản sau:
public class RatingRetrieverUnitTest { @Autowired private List<Rating> ratings; @Test public void givenOrder_whenInjected_thenByOrderValue() { assertThat(ratings.get(0).getRating(), is(equalTo(1))); assertThat(ratings.get(1).getRating(), is(equalTo(2))); assertThat(ratings.get(2).getRating(), is(equalTo(3))); } }
Kết bài
Chúng tôi đã tìm hiểu về chú thích @Order trong bài viết ngắn này. Chúng ta có thể tìm thấy ứng dụng của @Order trong các trường hợp sử dụng khác nhau – trong đó thứ tự của các component rất quan trọng. Ví dụ như Spring request Filter, chúng ta cần xác định rõ những Filter nào được chạy trước, Filter nào chạy sau để đảm bảo tính đúng đắn cho chương trình.