猿问

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

我有以下代码,其中我不明白 EmailService 的新实例是在哪里创建的。我试图检查许多其他 stackoverflow 对话,但仍然无法清楚地了解它。


public interface MessageService {

    void sendMessage(String msg, String recipient);

}


@Singleton

public 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())。


神不在的星期二
浏览 152回答 1
1回答

慕慕森

通过反射 Guice 分析了MyApplication的构造函数,发现它依赖于MessageService( public MyApplication(MessageService service))。正是这个构造函数被采用,因为它被标记为@InjectGuice 尝试找出此接口的绑定。在AppInjector您指定的实现MessageService是EmailService( bind(MessageService.class).to(EmailService.class);)EmailService通过Java 反射 API实例化。它是通过Class.newInstance之后EmailService被创建,它是作为参数传递MyApplication.class.newInstance()的工厂。笔记:默认情况下,如果您没有指定任何额外的构造函数,则有一个没有参数的默认构造函数,这就是为什么EmailService没有依赖项的原因。EmailService实例是单例,因为它被标记为@Singleton,所以如果对它有更多的依赖,就会注入完全相同的实例如果要创建到 instance 的绑定,可以使用以下代码:bind(MessageService.class).toInstance(new EmailService());Google 库在文档方面总是很丰富。我建议你通读这个维基:google/guice/wiki
随时随地看视频慕课网APP

相关分类

Java
我要回答