2014-12-27 27 views
5

Tôi đang gặp một số vấn đề khi cấu hình Spring được áp dụng theo thứ tự mong muốn với Spring Boot trong một dự án Maven đa module.Spring Boot AutoConfiguration Order

Tôi có các mô-đun A và B do tôi viết và phụ thuộc vào mô-đun bên thứ ba mà tôi không kiểm soát trong mô-đun C (phụ thuộc như sau: A phụ thuộc vào C, B tùy thuộc vào A)

Trong mô-đun AI có một lớp được chú thích với @Configuration và cũng là @AutoConfigureBefore(ClassFromModuleD.class). Trong mô đun BI có một lớp khác được chú thích với @Configuration và cũng là @AutoConfigureBefore(ClassFromModuleA.class)

Tôi hy vọng điều này sẽ dẫn đến định nghĩa bean trong mô-đun B của tôi được định cấu hình đầu tiên, tiếp theo là các hạt trong mô-đun của tôi

Tôi cũng đã thử thêm tệp META-INF/spring.factories vào cả mô-đun A và B khai báo tệp cấu hình duy nhất có trong mô-đun riêng của nó. Ví dụ. cho module A

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleAConfiguration

và trong mô-đun B:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleBConfiguration

Tôi không nhìn thấy thứ tự mong muốn cấu hình, trên thực tế, nó có vẻ là hoàn toàn trái ngược với những gì tôi muốn . Tôi đã sử dụng báo cáo ghi nhật ký và trình gỡ lỗi để xem qua và có vẻ như cấu hình từ Mô-đun C được áp dụng trước, sau đó là A rồi cuối cùng B.

Có thể chỉ ra những gì tôi có thể đã bỏ lỡ hoặc nếu có cách khác làm cái này? Cảm ơn rất nhiều trước.

+0

bạn có thể chỉ cho lớp cấu hình chính của bạn? Bạn có ý nghĩa gì bởi "cấu hình" (làm thế nào để bạn biết rằng một điều đến trước một lúc euntime)? –

+0

Lớp cấu hình chính trông như thế này: '@EnableReactor @SpringBootApplication public class SpringConfiguration {} ' Tôi tin rằng thứ tự không phải là những gì tôi mong muốn bởi vì tôi đã đặt breakpoint trong các phương pháp định nghĩa bean khác nhau và chúng không bị tấn công theo thứ tự mà tôi hy vọng. Vấn đề là, một bean trong mô-đun C cố gắng tra cứu một bean trong ngữ cảnh không có sẵn bởi vì nó được cấu hình bởi các mô-đun A và B chưa được cấu hình tự động ... Nếu tôi duyệt qua mã chạy module C và sau đó một thời gian sau đó các bean được cấu hình (quá muộn)! –

+0

Chú thích 'AutoconfigureBefore/After' chỉ áp dụng cho thứ tự các lớp được nhập vào nhà máy đậu. Họ không nói bất cứ điều gì về thứ tự mà đậu được tạo ra để điểm break của bạn không thực sự giúp đỡ để hiểu được vấn đề. Nếu một bean không thể được tạo ra phải có một lỗi và một dấu vết stack, vì vậy có lẽ nó sẽ giúp đỡ để đăng những người? –

Trả lời

0

Tự động định cấu hình Spring được sử dụng để cung cấp cấu hình cơ bản nếu một số lớp nhất định có trong đường dẫn lớp hay không.

Điều này được sử dụng, ví dụ: để cung cấp cấu hình Jpa cơ bản nếu Hibernate nằm trên đường dẫn lớp.

Nếu bạn muốn cấu hình thứ tự mà đậu được khởi tạo bởi mùa xuân, bạn có thể sử dụng

@DependsOn("A") 
public class B{ 
...  
} 

Điều này sẽ tạo ra đậu "A", hơn là "B".

Tuy nhiên, thứ tự bạn mong muốn có thể không thực hiện được. Bạn đã viết:

Một phụ thuộc vào C, B phụ thuộc vào Một

Nếu 'phụ thuộc vào' có nghĩa là: A cần C được khởi tạo, đậu phải được tạo ra theo trình tự sau:

  1. C - bởi vì C phụ thuộc vào gì
  2. A - vì A phụ thuộc vào C, mà đã được tạo ra.
  3. B - vì B phụ thuộc vào A, đã được tạo.

Mùa xuân tự động phát hiện các phụ thuộc bằng cách phân tích các lớp bean.

Nếu A có một tài sản autowired hoặc một cuộc tranh cãi cosntructor loại C, mùa xuân 'biết' rằng nó phải nhanh chóng C trước khi A.

Trong hầu hết các trường hợp này làm việc tốt.

Trong một số trường hợp, mùa xuân không thể 'đoán' phụ thuộc và tạo hạt theo thứ tự không mong muốn. Hơn bạn có thể 'thông báo' mùa xuân thông qua chú giải @DependsOn về sự phụ thuộc. Mùa xuân sẽ cố gắng thay đổi thứ tự cho phù hợp.

Trong trường hợp của bạn, nếu các phụ thuộc bạn mô tả không rõ ràng cho mùa xuân, và sự phụ thuộc không cần thiết để tạo ra các hạt cà phê, bạn có thể cố gắng để thay đổi thứ tự với @DependsOn:

Một phụ thuộc vào C, B phụ thuộc vào Một

thể đạt được với

@DependsOn("C") 
public class A{ 
    ...  
} 

@DependsOn("A") 
public class B{ 
    ...  
} 

// C comes from another module 
// and no need to annotate 
Các vấn đề liên quan