2010-04-26 36 views
26

Google Guice cung cấp một số tính năng tiêm phụ thuộc tuyệt vời.Các tính năng ẩn của Google Guice

Tôi đã xem qua các tính năng @Nullable thời gian gần đây cho phép bạn đánh dấu đối số nhà xây dựng như tùy chọn (cho phép null) kể từ Guice không cho phép những theo mặc định:

ví dụ

public Person(String firstName, String lastName, @Nullable Phone phone) { 
    this.firstName = checkNotNull(firstName, "firstName"); 
    this.lastName = checkNotNull(lastName, "lastName"); 
    this.phone = phone; 
} 

https://github.com/google/guice/wiki/UseNullable

các tính năng hữu ích khác của Guice (đặc biệt là những người ít rõ ràng) mà mọi người sử dụng là gì?

+6

Tính năng ẩn như thế nào? Đó là trong hướng dẫn thực hành tốt nhất là hai lần nhấp chuột từ trang chính. –

+1

Đó là ba thực sự, nếu bạn muốn được pedantic về nó ...! – Jon

Trả lời

39

Không ai trong số 'em đang dự định sẽ được ẩn, nhưng đây là những yêu thích của tôi 'tính năng tiền thưởng' trong Guice:

  • Guice thể inject a TypeLiteral<T>, hiệu quả đánh bại tẩy xoá.
  • TypeLiteral thể làm generic type resolution: đây nói với bạn rằng get() trên một danh sách < Chuỗi > trả về một Iterator < Chuỗi >.
  • Types là một nhà máy để triển khai các giao diện kiểu chung của Java.
  • Grapher trực quan hóa kim phun. Nếu nhà cung cấp tùy chỉnh của bạn triển khai HasDependencies, nó có thể tăng thêm đồ thị này.
  • Modules.override() vô cùng tiện dụng trong một nhúm.
  • Cú pháp ngắn để xác định các khóa được tham số: new Key < Danh sách < Chuỗi > >() {}.
  • Binder.skipSources() cho phép bạn viết các tiện ích có thông báo lỗi theo dõi số dòng đúng cách.
  • The SPI. Elements.getElements() tách mô-đun thành các nguyên tử và Elements.getModule() đặt chúng trở lại với nhau.
  • Nếu bạn triển khai equals() và hashCode() trong Mô-đun, bạn có thể cài đặt mô-đun đó nhiều lần mà không gặp sự cố.
13

Tôi thích cách hoàn toàn mở giao diện Scope là: về cơ bản, nó chỉ là một phép chuyển đổi từ Provider thành Provider. (Được rồi, từ KeyProvider đến Provider)

Muốn một số thứ về cơ bản Singleton, nhưng đọc lại từ cơ sở dữ liệu sau mỗi nửa giờ? Thật dễ dàng để tạo ra một phạm vi cho điều đó. Bạn muốn chạy một số yêu cầu trong nền và có phạm vi có nghĩa là "tất cả các yêu cầu nền bắt đầu từ cùng một yêu cầu HTTP?" Nó tương đối dễ dàng để viết rằng Scope quá.

Muốn phạm vi một số Key trên máy chủ của bạn trong khi kiểm tra để nó sử dụng một phiên bản riêng cho từng thử nghiệm mà bạn đang chạy từ khách hàng? (Với thử nghiệm vượt qua id thử nghiệm trong một Cookie hoặc tham số HTTP phụ) Đó là khó khăn hơn để làm, nhưng nó hoàn toàn có thể và vì vậy someone's already written that for you.

Có, lạm dụng quá mức Scope sẽ khiến Jesse bắt đầu săn lùng xung quanh cho cổ phần và đinh hương tỏi, nhưng tính linh hoạt tuyệt vời của nó có thể thực sự hữu ích.

+1

Đúng trên cả hai tính! –

12

Một tính năng tuyệt vời của Guice là cách dễ dàng làm cho việc thực hiện phương pháp đánh chặn ở bất kỳ Module, sử dụng:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher, 
    Matcher<? super Method> methodMatcher, 
    MethodInterceptor... interceptors); 

Bây giờ, bất kỳ phương pháp phù hợp với methodMatcher trong một lớp học phù hợp với classMatcher trong đó phạm vi Module 's được chặn bởi interceptors.

Ví dụ:

bindInterceptor(
    Matchers.any(), 
    Matchers.annotatedWith(Retryable.class), 
    new RetryableInterceptor()); 

Bây giờ, chúng tôi chỉ đơn giản là có thể chú thích bất kỳ phương pháp với @RetryableRetryableInterceptor của chúng tôi có thể thử lại nó nếu nó không thành công.

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