簡體   English   中英

使用Guice構造函數注入

[英]Constructor Injection using Guice

我有一些使用工廠的示例代碼。 我想通過刪除工廠來清理代碼並使用Guice代替。 我試圖這樣做,但我遇到了一個小障礙。 我對Guice很新,所以我希望有人可以幫助我。

現有客戶端代碼(使用工廠):

public class MailClient {

    public static void main(String[] args) {
        MailConfig config = MailConfigFactory.get();
        config.setHost("smtp.gmail.com");
        Mail mail = MailFactory.get(config);
        mail.send();
    }
}

我試圖使用Guice進行重構:

//Replaces existing factories
public class MailModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Mail.class)
        .to(MailImpl.class);

        bind(MailConfig.class)
        .to(MailConfigImpl.class);
    }
}

public class MailImpl implements Mail {

    private final MailConfig config;

    @Inject
    public MailImpl(MailConfig config) {
        this.config = config;
    }

    public void send() { ... }
}

public class MailClient {

    public static void main(String[] args) {
        MailModule mailModule = new MailModule();
        Injector injector = Guice.createInjector(mailModule);
        MailConfig config = injector.getInstance(MailConfig.class);
        config.setHost("smtp.gmail.com");
        Mail mail = //??
        mail.send();
     }
}

如何在修改后的MailImpl使用對象config構造MailImpl實例? 我應該以這種方式使用Guice嗎?

看看AssistedInject 它似乎解決了這個問題。

2個解決方案是可能的:1)將配置綁定為guice對象,包括其主機參數。 然后只是注入Mail,在你的main方法中你忽略了郵件有進一步依賴的事實。

2)必須為每個發送(收件人?)單獨配置郵件。 然后你別無選擇,但使用MailFactory自己創建它。

您可以在MailModule中執行以下操作:

public class MailModule extends AbstractModule {
    @Override
    protected void configure() {
       ... // other bindings
    }

    @Provides
    MailConfig getMailConfig( ... ) {
        MailConfig config = new MailConfig( ... );
        config.setHost("smtp.gmail.com");
        config;
    }
}

如果你想要一個單獨的MailConfig,將@Singleton注釋添加到getMailConfig(),Bob是你的叔叔。

請注意,必須綁定getMailConfig的參數。 綁定常用類型(如String)時,請務必添加綁定注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM