2009-10-14 26 views
20

Tôi mới đến Guice và đây là một câu hỏi ngây thơ. Tôi đã học được rằng chúng ta có thể ràng buộc String để một giá trị đặc biệt thông qua:Làm thế nào để ràng buộc String để biến trong Guice?

bind(String.class) 
     .annotatedWith(Names.named("JDBC URL")) 
     .toInstance("jdbc:mysql://localhost/pizza"); 

Nhưng nếu tôi muốn để ràng buộc String để bất kỳ ký tự có thể?

Hoặc tôi nghĩ rằng nó có thể được mô tả như sau:

Làm thế nào tôi có thể thay thế "new SomeClass (String strParameter)" với Guice?

+2

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. –

Trả lời

37

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.

+0

Tại sao lại bỏ phiếu? – NamshubWriter

0

tôi tìm một giải pháp trong FAQ của Guice:

http://code.google.com/docreader/#p=google-guice&s=google-guice&t=FrequentlyAskedQuestions

Ngoài ra để xác định một chú thích và một String thuộc tính trong MyModule, tôi cần phải viết bên dưới dòng để có được một thể hiện của SomeClass:

SomeClass instance = Guice.createInjector(new MyModule("any string i like to use")).getInstance(SomeClass.class); 

Nhưng tôi nhớ rằng Injector.getInstance() không nên được sử dụng ngoại trừ đối tượng gốc, vì vậy có cách nào tốt hơn để làm điều này không?

18

Điều này có thể không đúng chủ đề, nhưng Guice làm cho cấu hình dễ dàng hơn nhiều so với việc viết một ràng buộc rõ ràng cho mọi Chuỗi bạn cần. Bạn chỉ có thể có một tập tin cấu hình cho họ:

Properties configProps = Properties.load(getClass().getClassLoader().getResourceAsStream("myconfig.properties"); 
Names.bindProperties(binder(), configProps); 

và thì đấy tất cả các cấu hình của bạn đã sẵn sàng để tiêm:

@Provides // use this to have nice creation methods in modules 
public Connection getDBConnection(@Named("dbConnection") String connectionStr, 
            @Named("dbUser") String user, 
            @Named("dbPw") String pw,) { 
    return DriverManager.getConnection(connectionStr, user, pw); 
} 

Bây giờ chỉ cần tạo của bạn Java properties filemyconfig.properties tại thư mục gốc của classpath của bạn với

dbConnection = jdbc:mysql://localhost/test 
dbUser = username 
dbPw = password 

hoặc hợp nhất thông tin ủy quyền từ một số nguồn khác vào các thuộc tính và bạn đã đặt.

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