cuốn sách gpt4 ai đã làm

Làm thế nào để kiểm soát thứ tự tải đậu?

In lại Tác giả: Sahara Thời gian cập nhật: 26-12-2024 08:45:52 55 4
mua khóa gpt4 Nike

viết ở phía trước

Springboot tuân theo nguyên tắc quy ước lớn hơn cấu hình nên giải quyết được rất nhiều vấn đề về cấu hình rườm rà. Trên cơ sở đó, cơ chế spi được cung cấp và spring.factories có thể được sử dụng để hoàn thành chức năng lắp ráp tự động của một bộ phận nhỏ.

Trong các kịch bản nghiệp vụ chung, bạn có thể không cần quan tâm đến việc một Bean được đăng ký như thế nào trong Spring container, bạn chỉ cần khai báo Bean cần được đăng ký trong container là @Component, vì Spring sẽ tự động quét Bean để hoàn thành. khởi tạo và tải nó vào thùng chứa bối cảnh mùa xuân.

Tuy nhiên, nếu có sự phụ thuộc giữa một số Bean trong quá trình tải Bean, nghĩa là việc tải Bean A cần đợi cho đến khi Bean B được tải hoặc khi bạn đang phát triển một số phần mềm trung gian và cần hoàn tất quá trình lắp ráp tự động; Nó sẽ khai báo lớp Cấu hình của riêng nó, nhưng bạn có thể gặp phải một số đậu phụ thuộc lẫn nhau. Nếu bạn không kiểm soát nó, bạn có thể gặp lỗi không thể tìm thấy phần phụ thuộc.

Khung công tác Spring không thể tải các đậu theo thứ tự mà logic nghiệp vụ mong đợi nếu không chỉ định rõ ràng thứ tự tải, do đó, khung công tác Spring cần cung cấp khả năng cho các nhà phát triển chỉ định rõ ràng thứ tự tải đậu.

Một số hiểu lầm

Trước khi nói chính thức về cách kiểm soát thứ tự bốc hàng, tôi xin nói về 2 hiểu lầm:

  • Đã đánh dấu@Cấu hìnhTrong lớp học, @Bean viết ở phía trước có được đăng ký trước không?

Điều này không tồn tại trong thời đại XML, không có logic nào cho thấy nếu nó được viết ở phía trước thì nó sẽ được tải trước. Bởi vì xml không được tải dần dần mà tất cả đều được phân tích cú pháp, sau đó thực hiện phân tích và đăng ký phụ thuộc. Trong springboot, quá trình phân tích cú pháp xml thành các đối tượng bên trong spring bị bỏ qua, nhưng phương thức tải không thay đổi đáng kể.

  • sử dụng@Đặt hàngChú thích này có chắc chắn cho phép kiểm soát thứ tự tải không?

Nói đúng ra, không phải tất cả các loại đậu đều có thể được kiểm soát theo trình tự thông qua chú thích @Order. Bởi vì việc thêm chú thích @Order vào một phương thức hoặc lớp thông thường sẽ không có tác dụng.

Vậy loại đậu nào có thể được tải để @Order có thể kiểm soát? Giải thích chính thức:

{@code @Order} xác định thứ tự sắp xếp cho một thành phần được chú thích Kể từ Spring 4.0, thứ tự dựa trên chú thích được hỗ trợ cho nhiều loại thành phần trong Spring, ngay cả đối với việc chèn bộ sưu tập trong đó các giá trị thứ tự của các thành phần mục tiêu được đưa vào. tài khoản ( từ lớp mục tiêu hoặc từ phương thức {@code @Bean} của họ). Mặc dù các giá trị thứ tự như vậy có thể ảnh hưởng đến mức độ ưu tiên tại các điểm tiêm, vui lòng lưu ý rằng chúng không ảnh hưởng đến thứ tự khởi động đơn lẻ, đây là mối quan tâm trực giao được xác định bởi mối quan hệ phụ thuộc và { @code @DependsOn} khai báo (ảnh hưởng đến biểu đồ phụ thuộc được xác định trong thời gian chạy).

Lúc đầu, chú thích @Order được sử dụng để chỉ định mức độ ưu tiên của các khía cạnh sau 4.0, chức năng của nó đã được cải tiến để hỗ trợ việc chèn các bộ sưu tập, chỉ định thứ tự của các hạt trong bộ sưu tập và đặc biệt chỉ ra rằng nó được sử dụng cho một bộ sưu tập. ví dụ đậu. Lệnh này không có hiệu lực. Ba điểm sau đây hiện đang được sử dụng thường xuyên hơn:

  • Kiểm soát thứ tự tải của các lớp AOP, nghĩa là@Diện mạoLớp chú thích
  • điều khiểnTrình nghe ứng dụngThực hiện thứ tự tải của các lớp
  • điều khiểnDòng lệnhRunnerThực hiện thứ tự tải của các lớp

Vui lòng xem phần sau để biết chi tiết cách sử dụng.

Làm thế nào để kiểm soát

@Họ chú thích có điều kiện

  • @ConditionalOnClass: Lớp cấu hình sẽ chỉ có hiệu lực khi lớp được chỉ định tồn tại trong đường dẫn lớp.
@Configuration // Lớp cấu hình sẽ chỉ có hiệu lực khi lớp được chỉ định tồn tại trong đường dẫn lớp. @ConditionalOnClass(name = "com.example.SomeClass") lớp công khai MyConfiguration { // ... }
  • @ConditionalOnMissingClass: Lớp cấu hình sẽ chỉ có hiệu lực khi lớp được chỉ định không tồn tại trong đường dẫn lớp.
  • @ConditionalOnBean: Lớp cấu hình sẽ chỉ có hiệu lực khi Bean được chỉ định tồn tại trong vùng chứa.
  • @ConditionalOnMissingBean: Lớp cấu hình sẽ chỉ có hiệu lực khi Bean được chỉ định không tồn tại trong vùng chứa.

@DependsOn

Chú thích @DependsOn có thể được sử dụng để kiểm soát thứ tự tạo các hạt đậu. Chú thích này được sử dụng để khai báo rằng hạt đậu hiện tại phụ thuộc vào một hạt đậu khác. Các đậu phụ thuộc sẽ được đảm bảo bởi vùng chứa sẽ được khởi tạo trước khi đậu hiện tại được khởi tạo.

Cách sử dụng @DependsOn:

  • Được đánh dấu trực tiếp hoặc gián tiếp bằng@Thành phầnPhía trên lớp chú thích;
  • Được đánh dấu trực tiếp hoặc gián tiếp bằng@BeanPhương pháp chú thích ở trên;
  • sử dụng@DependsOnChú thích ở cấp độ lớp chỉ hợp lệ khi sử dụng phương pháp quét thành phần với If.@DependsOnLớp có chú thích được sử dụng thông qua XML và chú thích sẽ bị bỏ qua.Bằng cách này nó sẽ hoạt động.

Ví dụ:

@Configuration lớp công khai BeanOrderConfiguration { @Bean @DependsOn("beanB") public BeanA BeanA(){ System.out.println("bean A init"); return new BeanA(); .out.println("bean B init"); return new BeanB() } @Bean @DependsOn({"beanD","beanE"}) public BeanC BeanC(){ System.out.println("bean C init"); return new BeanC(); } @Bean @DependsOn("beanE") public BeanD BeanD(){ System.out.println("bean D init"); return new BeanD() } @Bean public BeanE; BeanE(){ System.out.println("bean E init"); trả về BeanE mới();

Thứ tự tải của các hạt trong đoạn mã trên là:

đậu B init đậu A init đậu E init đậu D init đậu C init

Tiêm tham số

Trên phương thức được đánh dấu bằng @Bean, nếu một tham số được truyền vào, springboot sẽ tự động tìm kiếm tham chiếu thuộc loại này trong ngữ cảnh mùa xuân cho tham số này. Và khởi tạo thể hiện của lớp này trước.

Sử dụng tính năng này, chúng ta cũng có thể kiểm soát thứ tự tải đậu.

Ví dụ:

@Bean public BeanA BeanA(BeanB demoB){ System.out.println("bean A init"); return new BeanA(); } @Bean public BeanB BeanB(){ System.out.println("bean B init") ; trả về BeanB mới();

Kết quả của điều trên là BeanB được khởi tạo và tải trước BeanA.

Cần lưu ý rằng springboot sẽ tìm kiếm theo loại. Nếu nhiều phiên bản thuộc loại này được đăng ký vào ngữ cảnh mùa xuân, chúng cần được chỉ định bằng @Qualifier("Bean name").

Tận dụng các điểm mở rộng trong vòng đời của đậu

Trong hệ thống lò xo, có một vòng đời từ vùng chứa đến khởi tạo & khởi tạo Bean, đồng thời nhiều điểm mở rộng được cung cấp để cho phép mở rộng hợp lý trong các bước này.

Thứ tự tải của các điểm mở rộng này được điều khiển bởi chính lò xo và hầu hết chúng không thể can thiệp được. Bạn có thể sử dụng điều này để mở rộng các điểm mở rộng của lò xo. Thêm mã khởi tạo doanh nghiệp của riêng bạn vào điểm mở rộng tương ứng. Kiểm soát trình tự không bao giờ đạt được.

Về việc phân tích cụ thể hầu hết các điểm mở rộng trong spring container, trước đây tôi đã viết một bài giới thiệu chi tiết: tất cả các điểm mở rộng trong Spring&SpringBoot.

hoàn thànhĐã đặt hàng/Đã đặt hàng ưu tiênGiao diện/chú thích

Spring cung cấp các phương thức sau để kiểm soát thứ tự tải đậu:

  • hoàn thànhĐã đặt hàng/Đã đặt hàng ưu tiênGiao diện, ghi đè phương thức đặt hàng
  • sử dụng@Order/@Ưu tiênchú thích,@Đặt hàngChú thích có thể được sử dụng ở cấp phương thức, trong khi@Sự ưu tiênChú thích không hoạt động;

Đối với các loại đậu tùy chỉnh, các phương pháp trên có thể kiểm soát thứ tự tải đậu. Bất kể bạn triển khai giao diện hay sử dụng chú thích như thế nào, giá trị càng nhỏ thì mức độ ưu tiên càng cao. Khi bạn triển khai giao diện PriorityOrdered hoặc sử dụng các đậu có chú thích @Priority, mức độ ưu tiên tải của chúng sẽ cao hơn so với việc triển khai giao diện Ordered hoặc sử dụng @Order. . Bean được chú thích.

Cần lưu ý rằng việc sử dụng phương pháp trên sẽ chỉ thay đổi thứ tự (hoặc mức độ ưu tiên) trong đó các Bean triển khai cùng một giao diện được tải vào các bộ sưu tập (chẳng hạn như List, Set, v.v.), nhưng phương pháp này sẽ không ảnh hưởng đến sự khác biệt khi bối cảnh ứng dụng Spring được bắt đầu. Thứ tự khởi tạo Bean (thứ tự khởi động).

  • Trường hợp lỗi: Mã trường hợp sau không thể chỉ định trình tự cấu hình
@Component @Order(1) public class BeanA { // Định nghĩa BeanA } @Component @Order(2) public class BeanB { // Định nghĩa BeanB }
  • Trường hợp sử dụng đúng:

Đầu tiên hãy xác định hai Bean để triển khai cùng một giao diện và thêm chú thích @Order.

giao diện công khai IBean { } @Order(2) @Component lớp công khai AnoBean1 triển khai IBean { Private String name = "ano order Bean 1"; public AnoBean1() { System.out.println(name); @Component lớp công khai AnoBean2 triển khai IBean { tên chuỗi riêng = "ano order Bean 2"; System.out.println(tên); } }

Sau đó, trong một Bean thử nghiệm, hãy đưa vào một danh sách IBeans. Chúng ta cần kiểm tra xem thứ tự của các Bean trong danh sách này có phù hợp với các quy tắc @Order đã xác định hay không.

@Component public class AnoTestBean { public AnoTestBean(List anoBeanList) { for (IBean Bean : anoBeanList) { System.out.println("in ano testBean: " + Bean.getClass().getName()); }

@AutoConfigureOrder

Chú thích này được sử dụng để chỉ định thứ tự tải các tệp cấu hình. Tuy nhiên, qua thử nghiệm thực tế thì thấy cách sử dụng sau không mang lại hiệu quả:

@Configuration @AutoConfigureOrder(2) public class BeanOrderConfiguration1 { @Bean public BeanA BeanA(){ System.out.println("bean A init"); return new BeanA(); } } @Configuration @AutoConfigureOrder(1) public class BeanOrderConfiguration2 { @Bean công khai BeanB BeanB(){ System.out.println("bean B init"); trả về BeanB mới();

Dù bạn điền bao nhiêu số thì thứ tự nạp cũng không thay đổi. Vậy @AutoConfigureOrder này được sử dụng như thế nào?

@AutoConfigureOrder có thể áp dụng cho thứ tự của AutoConfig trong các gói phụ thuộc bên ngoài, nhưng không thể sử dụng để chỉ định thứ tự trong gói này. Các gói có thể được quét trong dự án của bạn đều là Cấu hình bên trong và spring giới thiệu Cấu hình bên ngoài thông qua tệp spi duy nhất của spring: spring.factories.

Nói cách khác, @AutoConfigureOrder có thể thay đổi thứ tự của @Configuration trong spring.factories.

Cách sử dụng cụ thể:

@Configuration @AutoConfigureOrder(10) public class BeanOrderConfiguration1 { @Bean public BeanA BeanA(){ System.out.println("bean A init"); return new BeanA(); } } @Configuration @AutoConfigureOrder(1) public class BeanOrderConfiguration2 { @Bean công khai BeanB BeanB(){ System.out.println("bean B init"); trả về BeanB mới();

mùa xuân.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.demo.BeanOrderConfiguration1,\ com.example.demo.BeanOrderConfiguration2

Tóm tắt

Trên thực tế, tại nơi làm việc, tôi tin rằng nhiều người đã gặp phải tình trạng tải đậu với các phần phụ thuộc phức tạp. Nếu chúng ta để sự không chắc chắn này xảy ra, tốt hơn là chúng ta nên tự kiểm soát nó để có thể dễ dàng nhìn thấy nó khi đọc mã. giữa các hạt đậu.

Chuyên mục câu hỏi phỏng vấn

Chuyên mục câu hỏi phỏng vấn Java trực tuyến, chào mừng bạn đến thăm.

  • Nếu bạn không biết cách viết sơ yếu lý lịch, bạn không biết cách đóng gói các mục trong sơ yếu lý lịch;
  • Nếu có điều gì đó trong sơ yếu lý lịch của bạn mà bạn không biết có nên đưa vào hay không;
  • Nếu bạn không biết cách trả lời một số câu hỏi toàn diện;

Sau đó, bạn có thể gửi tin nhắn riêng cho tôi và tôi sẽ cố gắng hết sức để giúp bạn.

Cuối cùng, bài viết này nói về cách kiểm soát thứ tự nạp đậu? Vậy là xong bài viết này. Nếu bạn muốn biết thêm về cách kiểm soát thứ tự nạp đậu? Về nội dung, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

55 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress