为了账号安全,请及时绑定邮箱和手机立即绑定

Google Guice Depedency Injection - 对象究竟是在哪里创建的?

Google Guice Depedency Injection - 对象究竟是在哪里创建的?

神不在的星期二 2021-06-22 12:19:05
我有以下代码,其中我不明白 EmailService 的新实例是在哪里创建的。我试图检查许多其他 stackoverflow 对话,但仍然无法清楚地了解它。public interface MessageService {    void sendMessage(String msg, String recipient);}@Singletonpublic class EmailService implements MessageService {    @Override    public void sendMessage(String msg, String recipient) {        System.out.println("Sending Email to"+recipient+"Msg is:" + msg);    }}public class MyApplication {    private MessageService service;    @Inject    public MyApplication(MessageService service) {      this.service = service;    }    public void sendMessage(String msg, String recipient) {        this.service.sendMessage(msg, recipient);    }}public class AppInjector extends AbstractModule {    @Override    protected void configure() {      bind(MessageService.class).to(EmailService.class);    }}public class ClientApplication {    public static void main(String[] args) {        Injector inj = Guice.createInjector(new AppInjector());        MyApplication app = inj.getInstance(MyApplication.class);        app.sendMessage("How are you?", "hello@hello.com");    }}在这段代码中,没有任何地方创建了类 EmailService 的新实例,类似于 (new EmailService())。
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

  1. 通过反射 Guice 分析了MyApplication的构造函数,发现它依赖于MessageServicepublic MyApplication(MessageService service))。正是这个构造函数被采用,因为它被标记为@Inject

  2. Guice 尝试找出此接口的绑定。在AppInjector您指定的实现MessageServiceEmailServicebind(MessageService.class).to(EmailService.class);)

  3. EmailService通过Java 反射 API实例化。它是通过Class.newInstance

  4. 之后EmailService被创建,它是作为参数传递MyApplication.class.newInstance()的工厂。

笔记:

  • 默认情况下,如果您没有指定任何额外的构造函数,则有一个没有参数的默认构造函数,这就是为什么EmailService没有依赖项的原因。

  • EmailService实例是单例,因为它被标记为@Singleton,所以如果对它有更多的依赖,就会注入完全相同的实例

  • 如果要创建到 instance 的绑定,可以使用以下代码:bind(MessageService.class).toInstance(new EmailService());

  • Google 库在文档方面总是很丰富。我建议你通读这个维基:google/guice/wiki


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信