Tôi tiếp tục muốn thử điều này trên quy mô lớn hơn với hệ thống + ứng dụng + xây dựng của chúng tôi, nhưng ưu tiên cao hơn tiếp tục đẩy nó vào ổ ghi sau. Nó có vẻ giống như một cách tốt đẹp để tải các mô-đun Guice và tránh khiếu nại phổ biến về "cấu hình mã hóa cứng". Các thuộc tính cấu hình riêng hiếm khi thay đổi, nhưng hầu như bạn sẽ luôn có một bộ hồ sơ, thường là cho các môi trường khác nhau (Debug, Production, ...).Có ai đã sử dụng ServiceLoader cùng với Guice không?
ServiceLoader cho phép bạn kéo danh sách tất cả các triển khai được định nghĩa là dịch vụ cho một loại nhất định. Đưa này cùng với Guice, bạn kết thúc với:
import java.util.ServiceLoader;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
public class ModuleLoader<M extends Module> extends AbstractModule {
private final Class<M> type;
public ModuleLoader(Class<M> type) {
this.type = type;
}
public static <M extends Module> ModuleLoader<M> of(Class<M> type) {
return new ModuleLoader<M>(type);
}
@Override
protected void configure() {
ServiceLoader<M> modules = ServiceLoader.load(type);
for (Module module : modules) {
install(module);
}
}
}
dụ sử dụng (như một bộ nạp servlet động trong một dự án Guice-servlet):
import com.google.inject.servlet.ServletModule;
public class ServletLoader extends GuiceServletContextListener {
@Override
protected final Injector getInjector() {
return Guice.createInjector(ModuleLoader.of(ServletModule.class);
}
}
Các dịch vụ (đóng gói như module) sẽ là đóng gói trong các tập tin jar riêng biệt. Trong mỗi bạn sẽ định nghĩa lớp (es) trong meta-data:
Within servlets.jar: META-INF/services/com.google.inject.Module
com.example.webapps.MyServletModuleA
com.example.webapps.MyServletModuleB
Kể từ khi chúng tôi sử dụng Maven, chúng tôi nghĩ rằng đây sẽ là lý tưởng như chúng ta có thể kéo trong việc triển khai khác nhau khi chạy qua phụ thuộc hồ sơ. Có ai đang sử dụng Guice như thế này không?
Nếu không, vui lòng sử dụng ví dụ này và xem nó hoạt động như thế nào cho bạn. (ServiceLoader chỉ được hỗ trợ trong JDK6 +)
Bạn có thể trợ giúp không? Tôi đang cố gắng để làm một cái gì đó tương tự nhưng có một vấn đề noobie với ServiceLoader? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed