2011-01-26 37 views
18

Đối với phần mềm giám sát được viết bằng Java, tôi xem xét sử dụng Google Guice làm nhà cung cấp DI. Dự án cần tải cấu hình của nó từ một tài nguyên bên ngoài (tệp hoặc cơ sở dữ liệu). Ứng dụng này được thiết kế để chạy trong chế độ độc lập hoặc trong một thùng chứa servlet.Cấu hình ứng dụng guice và chung

Hiện tại, cấu hình không chứa các ràng buộc hoặc tham số để tiêm phụ thuộc, chỉ một số cài đặt ứng dụng chung (định nghĩa kết nối JDBC và các đối tượng quản lý/giám sát cơ sở dữ liệu liên quan).

tôi thấy hai lựa chọn:

  • để sử dụng thư viện khác, ví dụ Apache Commons Configuration, mà hỗ trợ tập tin và cấu hình JDBC nguồn (và nhiều người khác)

hoặc

  • để sử dụng một tệp dựa trên addon cho Guice như guice-xml-config để lưu trữ các tùy chọn ứng dụng (điều này sẽ cho phép cấu hình phần DI sau này nếu nó trở thành neces sary).

Bạn có đề xuất sử dụng Guice cho cả hai tác vụ hoặc giữ cấu hình ứng dụng chung tách biệt với việc tiêm phụ thuộc không? Những lợi thế và bất lợi nào bạn sẽ xem xét những ưu điểm và nhược điểm quan trọng nhất?

Trả lời

29

Nó đơn giản để húp một tập tin bất động sản trong một module Guice:

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    try { 
     Properties properties = new Properties(); 
     properties.load(new FileReader("my.properties")); 
     Names.bindProperties(binder(), properties); 
    } catch (IOException ex) { 
     //... 
    } 
    } 
} 

Sau đó thật dễ dàng để chuyển từ Properties để cấu hình các nguồn khác.

[Chỉnh sửa]

BTW, bạn có thể nhận được các tính chất tiêm bằng cách chú thích nó với @Named("myKey").

+1

+1 Tôi nghĩ bạn cũng nên đề cập đến cách các thuộc tính được tiêm bằng cách sử dụng '@ Named'. – ColinD

1

Tôi đã gặp sự cố tương tự trong dự án của riêng mình. Chúng tôi đã chọn Guice là DI-framework và để giữ cho mọi thứ đơn giản muốn sử dụng nó cũng với cấu hình.

Chúng tôi đã đọc cấu hình từ tệp thuộc tính sử dụng Apache Commons Configuration và gắn kết chúng với bộ phun Guice như được đề xuất trong Câu hỏi thường gặp về guice How do I inject configuration parameters?.

@Override public void configure() { 
    bindConstant().annotatedWith(ConfigurationAnnotation.class) 
     .to(configuration.getString("configurationValue"));  
} 

Tải lại cấu hình được hỗ trợ bởi cấu hình Commons cũng khá dễ dàng thực hiện vào tiêm Guice.

@Override public void configure() { 
    bind(String.class).annotatedWith(ConfigurationAnnotation.class) 
     .toProvider(new Provider<String>() { 
      public String get() { 
       return configuration.getString("configurationValue"); 
      } 
    });  
} 
3

Kiểm tra thư viện Governator:

https://github.com/Netflix/governator/wiki/Configuration-Mapping

Bạn sẽ nhận được một chú thích @Configuration và một số nhà cung cấp cấu hình.Trong mã nó giúp để xem đâu là thông số cấu hình Bạn sử dụng:

@Configuration("configs.qty.things") 
private int numberOfThings = 10; 

Ngoài ra, Bạn sẽ nhận được một báo cáo cấu hình thoải mái khi khởi động:

https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation

3

Hãy thử Guice configuration sẵn trên maven trung tâm, đó là hỗ trợ Các thuộc tính, định dạng HOCON và JSON.

Bạn có thể tiêm các thuộc tính từ tập tin application.conf dịch vụ của bạn như:

@BindConfig(value = "application") 
public class Service { 

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

    @InjectConfig("services") 
    private ServiceConfiguration services; 
} 

Bạn phải cài đặt các module ConfigurationModule như

public class GuiceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     install(ConfigurationModule.create()); 
     requestInjection(Service.class); 
    } 
} 
Các vấn đề liên quan