2009-07-29 47 views
5

Gần đây tôi đã đăng một question về cách xác định việc triển khai dịch vụ trừu tượng ở phía máy khách.JAVA 6 ServiceLoader

dfa được đề cập java.util.ServiceLoader làm giải pháp cho vấn đề của tôi.

Tôi đã kết thúc theo một cách tương tự, mặc dù không sử dụng ServiceLoader trực tiếp, chủ yếu là vì tôi đã sử dụng JDK 5. Nhưng một câu hỏi khác của SOer đã đi vào hoảng loạn khi dfa đề cập đến ServiceLoader.

Tôi tự hỏi các vấn đề chính với việc triển khai ServiceLoader là gì. Mặc dù có giới hạn dường như là một cách hay để giải quyết vấn đề này mà không cần điền đầy đủ vào một số thư viện của bên thứ ba như Guice

+2

Câu hỏi này là một chút cũ, nhưng nếu có ai trong tương lai phát hiện này, câu trả lời này đến câu hỏi khác có thể làm sáng tỏ về lý do tại sao ServiceLoader không phải là rất tốt: http://stackoverflow.com/questions/7039467/java-serviceloader-with-multiple-classloaders/7237152#7237152 – Dogmatixed

Trả lời

2

ServiceLoader ít chung chung hơn khung tiêm phụ thuộc đầy đủ như Spring hoặc Guice. Nó được thiết kế để tải dịch vụ một cách lười biếng, có thể được triển khai trong thời gian chạy. Do đó, ServiceLoader đặc biệt hữu ích cho các plugin.

Để có câu trả lời hoàn chỉnh, bạn phải yêu cầu Tom Hawtin Tackline.

+0

Cảm xúc của tôi chính xác, đây là lý do tôi đăng câu hỏi này. Để hiểu, nếu có, lý do đằng sau sự không thích tính năng này –

4

ServiceLoader đã được thêm vào java.util trong JDK6, trước đó công nghệ cơ bản được sử dụng trong lớp Dịch vụ.

Khung dịch vụ và khung công tác DI giải quyết các vấn đề tương tự nhưng không phải là công nghệ tương đương. ServiceLoader tải các triển khai của một giao diện cụ thể được tìm thấy trong classpath. Ví dụ: nếu bạn có chương trình đọc bảng tính Excel và bạn thấy trình đọc có khả năng đọc tệp CSV (thực hiện cùng giao diện), bạn có thể thả trình đọc vào đường dẫn lớp và làm cho nó khả dụng và có thể chọn làm tùy chọn trong chương trình của bạn. (Điều này có nghĩa là mã của bạn vốn linh hoạt hơn).

Tiêm phụ thuộc (ít nhất là về mùa xuân) yêu cầu kiến ​​thức apriori về các lớp được tìm thấy trong đường dẫn lớp của nó để tiêm nó. Tệp cấu hình Spring của bạn cần được sửa đổi để tận dụng lợi thế của bất kỳ triển khai bổ sung nào mà bạn thêm vào đường dẫn lớp. Nó không thể chỉ đơn giản là chọn chúng bằng cách khởi động lại máy chủ.

1

Bỏ qua một số khác nhau performance complaints and class loader issues vấn đề kiến ​​trúc thực sự với ServiceLoader về cơ bản là thoái hóa thành Service locator pattern và tất cả các vấn đề chung đi kèm với mẫu định vị dịch vụ (bộ khởi tạo tĩnh). Do đó có một số người tin rằng mô hình định vị dịch vụ là điều xấu và tốt hơn để sử dụng toàn bộ khung công tác DI hoặc plugin đặc biệt kể từ khi @Inject hiện được chuẩn hóa.

Do đó một số lựa chọn thay thế là:

Các vấn đề liên quan