2013-02-12 26 views
7

Tôi đang trong quá trình học Guice và tôi không hiểu rõ cách sử dụng ví dụ Injector. Tốt hơn hết là tạo một ví dụ Injector một lần trên bootstrap của ứng dụng và làm cho nó trở thành công khai đơn?Làm thế nào để sử dụng Injector của Guice?

Và có đúng là chúng tôi luôn phải sử dụng Injector#getInstance(SomeClass.class) để nhận các lớp học mà chúng tôi đã putted chú thích @Inject của Guice?

+0

Tốt hơn hết là không nên sử dụng 'Injector.getInstance()'. – millimoose

+2

@millimoose nhưng cách nào khác để truy xuất các lớp do Guice quản lý? – MyTitle

+0

Các trường được chú thích bằng '@ Inject' sẽ có sẵn các lớp phù hợp" tự động ". (Giả sử bạn có Guice quản lý các lớp cần tiêm quá.) Ý tưởng là bạn có container quản lý cả các phụ thuộc của bạn, ** và ** các lớp sử dụng chúng, và chỉ lấy một lớp "chính" từ đầu phun thủ công để bắt đầu ứng dụng của bạn. Bạn cũng nên cân nhắc [rereading the tutorial] (https://code.google.com/p/google-guice/wiki/GettingStarted), đây là Dependency Injection 101. – millimoose

Trả lời

7

Bạn không được truyền kim phun xung quanh như một đĩa đơn toàn cầu. Bạn đã xem: https://github.com/google/guice/wiki/GettingStarted? Lưu ý rằng RealBillingService không sử dụng bộ phun để nhận các phiên bản CreditCardProcessorTransactionLog. Thay vào đó, Guice xử lý tất cả điều này cho bạn khi tạo cá thể.

Nếu bạn đang ở trong một tình huống mà bạn cần Guice để tạo ra nhiều đối tượng cùng loại xem xét sử dụng một Provider và tiêm nhà cung cấp đó.

+0

Vâng, tôi hiểu rồi. Nhưng điều gì sẽ xảy ra nếu tôi có nhiều dịch vụ như 'RealBillingService' và mỗi dịch vụ có các chú thích' @ Inject' để tiêm các đối tượng 'CreditCardProcessor' và' TransactionLog'. Vì vậy, tôi cần sử dụng 'Injector # getInstance' cho mọi dịch vụ như' RealBillingService'. Nhưng tôi muốn tạo các dịch vụ này ở các vị trí khác nhau, vì vậy tôi có 2 biến thể: tạo đối tượng 'Injector' ở mọi nơi và sử dụng' Injector # getInstance' để truy xuất dịch vụ cần thiết _or_ để tạo thể hiện «Injector' một khi làm cho nó có thể truy cập được (toàn cục singleton)) đến tất cả những nơi tôi cần. – MyTitle

+0

Hoặc có một đối tượng thứ ba có các trường hợp của hai dịch vụ của bạn (cả hai chú thích với '@ Inject'). Sau đó, bạn sẽ sử dụng 'Injector' để lấy một cá thể của đối tượng thứ ba này. – condit

+0

Trong thực tế, bạn hiếm khi nhìn thấy 'kim phun'. Nếu bạn đang sử dụng 'Jersey' với' Guice', ví dụ, bạn cấu hình Modules của bạn và sau đó khung sẽ xử lý phần còn lại. – condit

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