Trước tiên, bạn cần phải chú thích các nhà xây dựng cho SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
Tôi thích sử dụng chú thích tùy chỉnh, như thế này:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
Sau đó, bạn cần phải cung cấp một liên kết trong mô-đun của bạn :
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Sau đó, một thời gian Guice tạo SomeClass, nó sẽ tiêm tham số. Ví dụ: nếu SomeOtherClass phụ thuộc vào SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
Thông thường, khi bạn nghĩ bạn muốn tiêm một chuỗi, bạn muốn tiêm một đối tượng. Ví dụ: nếu Chuỗi là một URL, tôi thường tiêm một URI với chú thích ràng buộc.
Tất cả điều này giả định rằng có một số giá trị không đổi mà bạn có thể xác định tại thời gian tạo mô-đun cho Chuỗi. Nếu giá trị không có sẵn tại thời điểm tạo mô-đun, bạn có thể sử dụng AssistedInject.
DI (dependency Injection) với tất cả các thủ thuật đó khiến mã đọc khó hơn, mất mục tiêu gốc. nó là dễ dàng hơn không phụ thuộc tiêm trong hầu hết trường hợp, giữ bối cảnh ở một nơi. Điều này giúp bảo trì dễ dàng hơn nhiều. –