有没有一种方法可以在通过ui绑定创建的小部件中使用依赖项注入?
假设我有一个简单的小部件(在包com.example.client.ui.widget中):
public class Foo extends Composite {
private final EventBus eventBus;
@Inject
public Foo(final EventBus eventBus) {
this.eventBus = eventBus;
// create ui
}
}
然后我有一个视图,它是通过使用这个小部件的ui绑定定义的。例如:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:app='urn:import:com.example.client.ui.widget'>
<g:HorizontalPanel>
<app:Foo/>
</g:HorizontalPanel>
</ui:UiBinder>
这样做是行不通的,因为ui绑定中使用的小部件没有arg构造函数约束。但是,如果GWT编译器在有@Inject注释的情况下只使用GIN,那不是很好吗?或者这可以通过其他方式实现吗?也许我完全错过了GIN和GWT的概念,如果是这样的话,任何提示都将不胜感激。
提前感谢,Markus
如果您需要为小部件注入依赖项,那么您就做错了。
但是
可以使用GIN来向小部件中注入一些东西。
请考虑以下内容:GIN是一个独立的依赖注入框架,你只需要问你需要什么,GIN就会创建一个解析了依赖关系的bean。只有从Gijector实例中获得对象时,才会执行注入。UI绑定器是一个声明性UI的框架,它基于XML创建小部件(并做一些其他事情,但我们现在可以忽略它)。
所以,如果我们想使用GIN将依赖项注入Widget,这意味着Widget应该由GIN创建,而不是由UiBinder创建。UiBinder将不得不使用GIN提供的instace。有可能吗?是的,它UiBinder允许它通过:
在窗口小部件字段上使用注释@UiField(provided=true)
或
使用@UiFactory
因此,您需要做的是在GinModule中为小部件创建绑定,通过Gijector获取它的实例或为小部件注入提供程序,然后您可以通过@UiField(provided=true)或@UiFactory将小部件的实例提供给UiFinder。