我有以下代码,其中我不明白 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个赞
通过反射 Guice 分析了
MyApplication
的构造函数,发现它依赖于MessageService
(public MyApplication(MessageService service)
)。正是这个构造函数被采用,因为它被标记为@Inject
Guice 尝试找出此接口的绑定。在
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
添加回答
举报
0/150
提交
取消