- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我关注了 basic setup instructions在 GWT-GIN 教程页面上。我在第 3 步(声明绑定(bind))并试图找出如何使用 GIN 的 Binder API。
public class MyModule extends AbstractGinModule {
@Override
public void configure() {
// 1. Declare an instance of EventBus and make sure every
// injection request pulls back the same instance.
EventBus eventBus = new EventBus();
bind(EventBus.class).to??? // no toInstance() method!
// 2. Declare two instances of Fizz using different constructors,
// and allow the injection of either of them.
Fizz f1 = new Fizz(true, "oh yeah", null);
Fizz f2 = new Fizz();
bind(Fizz.class).to??? // no toInstance() AND don't know how to choose f1 or f2!
// 3. Declare a List of Buzz objects and allow them to be
// injectable.
List<Buzz> buzzes = new ArrayList<Buzz>();
configureBuzzes(buzzes); // adds configured Buzz objects to the list
bind(???).to(buzzes); // no toInstance() methods AND how to bind List<?>.class?!
// 4. Conditionally bind SomePlace to Place *only* when we want the default Place
// that 'historyHandler.handleCurrentHistory()' will go to when called onModuleLoad.
bind(Place.class).to(SomePlace.class); // forces me to only have SomePlace instances!
}
}
上面的四个用例是我正在努力解决的问题。分别是:
EventBus
实例?List
?Place.class
?提前致谢!
最佳答案
很好的问题有助于阐明 Guice 本身的工作原理,以及 Guice 和 Gin 之间的区别。 Gin 与 Guice 不太一样 - configure()
方法在生成 JavaScript 时运行,以便编译器仅在正确的类型集中进行烘焙 - 否则您的应用程序可能包含整个 JRE!这对 Gin 来说有点作弊,一旦你理解了这一点,GWT DI 就更有意义了。
基本思想是 configure()
方法只应该处理布线 - 而不是创建实例。这提供了 1) 的答案和 2) 的部分答案。实际上编写将在应用程序运行时使用的代码(Provider
对象、@Provides
方法,当然还有任何用 @Inject
注释的代码)需要反过来——它只会被编译成 JS。这意味着虽然您可以定义类似 configureBuzzes
的方法在 3) 中,你只需要小心从 configure()
中调用它们方法 - 并且从不调用configure()
来自常规应用程序代码。
2)、3) 和 4) 的答案主要与 Guice 本身的一般工作方式有关。我为 1) 提供的解决方案也适用于普通的 Guice,我会一直建议这种方法 - 我发现如果不混合布线和实际对象构建,它往往会产生更具可读性的代码.
不要在您的 configure()
中创建实例方法,只需进行绑定(bind)。您可以将绑定(bind)设置为例如
bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
创建实例,并将其限定为单例 - 默认情况下将使用默认构造函数。
如果您想使用非默认构造函数,有多种选择。您可以使用 @Inject
注释特定的构造函数,并为每个值提供一些注释(稍后会详细介绍),或者您可以构建提供程序或 @Provides
创建实例的方法。同样,您可能需要 @Singleton
使这有意义,但这取决于您的用例(这将是您的 GinModule 中的另一种方法):
@Provides
//@Singleton //optional, depends on your use case
public Fizz provideFirstFizz() {
return new Fizz(true, "oh yeah", null);
}
接下来,如何提供两种不同类型的同一事物?你如何在 Guice 中做到这一点?您如何期望您的代码获得 Fizz
注入(inject)得到正确的?事实证明,这些可能都有相同的答案——你需要找到一种方法来指示你想要哪个实例。它们都是相同的类型,所以这还不够,但我们可以提供其他提示,比如注入(inject)字段上的注释。说出我们的代码需要 f1
和 f2
看起来像这样
@Inject
@Red// Make up your own annotation, or use some existing ones
private Fizz f1;
@Inject @Blue private f2;
现在我们有办法区分它们,我们需要使用相同的注释来绑定(bind)它们。因为我们仍然假设没有 @Inject
在 Fizz
上构造函数,我们不能只做一个 bind()
调用,所以我们只添加 @Blue
提供方法:
@Provides
@Blue
//@Singleton //optional, depends on your use case
public Fizz provideFirstFizz() {
return new Fizz(true, "oh yeah", null);
}
我们可以将其解读为“此方法 Provides
Blue
Fizz 实例”。对于 @Red
,因为我们有默认的构造函数,我们可以使用bind()
:
bind(Fizz.class).annotatedWith(Red.class);//... no need to specify type
//in this case, but might want
//singleton
参见 https://code.google.com/p/google-guice/wiki/BindingAnnotations有关这方面的更多详细信息。
同样,我们可以使用 @Provides
为此,或创建并绑定(bind)一个 Provider<T>
类型。由于我们已经完成了几种提供程序方法,让我们尝试 Provider<List<Buzz>>
:
public class BuzzListProvider implements Provider<List<Buzz>> {
public List<Buzz> get() {
List<Buzz> buzzes = new ArrayList<Buzz>();
// Configure them... This might call on a @Inject defined
// within this BuzzListProvider, on the ctor or a field, or
// just some code in this method.
return buzzes;
}
}
然后,将 Provider 绑定(bind)到该列表:
// cant say List<Buzz>.class, use TypeLiteral instead
bind(new TypeLiteral<List<Buzz>>(){})
.toProvider(BuzzListProvider.class);
// .in(Singleton.class); if the list needs to be only created once
您的总结完全正确 - 这与 2 完全相同。我通常会做一个 @DefaultPlace
注释(或者只是简单的 @Default
,这样我就可以重新使用它)来处理这种情况。
关于java - 如何将基本的 GWT 组件与 GIN 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408466/
我想知道 GWT、GWT-RPC、EXT-GWT 和 Smart GWT 之间的区别。目前,我设法借了有关 GWT 的书籍,据我所知,它只是一个旨在促进快速高效的 Ajax(异步 JavaScript
不,这不是问如何让 Guava 在 GWT 中工作,因为我已经让它工作了。 我的问题是,当我执行继承时 我希望在命名空间 com.google.common.collect 中找到一个文件 Coll
Ext GWT 和 GWT-Ext 之间有区别吗?因为我在浏览 Ext GWT 时看到了这个页面 http://gwt-ext.com/demo/ .有什么帮助吗? 最佳答案 ExtGWT 由开发 E
调查gwt-dispatch之后和 Google Wave I/O presentation (Best practices) ( video here ),我想知道为什么官方 GWT 版本 (2.0
我在我的应用程序中使用带有 ext 的 GWT 2.0.3。该项目不再处于积极开发状态并且已被 Smart GWT 取代。我正在为此应用程序使用 HMVC 模式。现在使用现有的 GWT 2.0.3 和
当我尝试在 Windows Vista 上为 ie 8 使用 GWT 开发模式插件时,我不断看到安装插件的提示。 运行插件后我仍然总是看到这个页面。有谁知道如何解决这样的问题? 最佳答案 看这个:Ca
我正在尝试对 GWT RPC 序列化策略进行一些背景阅读,发现 GWT 在编译后将 *.gwt.rpc 文件中的可序列化类型列入白名单。 以下是我的应用程序中生成的一个此类 .gwt.rpc 文件的摘
如果 Enum 实现了 java.io.Serializable,我无法将它序列化为 GWT。它会成功编译 GWT,但在运行时,我会感到害怕: Type 'com....security..Admin
是否有可以与 GWT 一起使用的进度条小部件,还是必须自己制作?我尝试在 google-web-toolkit-incubator、gwtupload 和 upload4gwt 中使用进度条,但没有任
由于 Javadoc 没有说明使用 com.google.gwt.core.shared.GWT 的原因,它似乎包含 com.google.gwt.core.client.GWT 的功能子集,前者存在
我必须在 gwt 中创建一个图像按钮,它使用三个图像(左侧图像、中心拉伸(stretch)图像和右侧图像)。左侧图像和右侧图像具有圆角。中心图像想要拉伸(stretch)取决于按钮标题大小.创建的 I
我正在尝试在 GWT 的垂直面板中设置 align 属性,如下所示: vpanel = new VerticalPanel(); vPanel.setHorizontalAlignment(HasHo
我想在 GWT 中添加可编辑的组合框,请告诉我解决方案? 最佳答案 试试 Advanced GWT Components , 具体来说 org.gwt.advanced.client.ui.widge
我在使用 GWT Designer 配置 GXT 时遇到问题。我拥有 Eclipse、GWT 插件和 GXT 的所有新版本,但无法将 GXT 配置为与 GWT Designer 一起使用。我设置了我的
我们有一个当前使用 Capistrano 部署的应用程序。该应用程序使用 php 作为后端,使用 GWT 作为前端。 我已经设法通过 Ant 文件编译 GWT,但想用自定义 Capistrano 任务
这应该很简单,但不知何故我找不到在 GWT 中创建简单超链接的方法。基本上,我想在用户点击某些东西时加载另一个页面。 Hyperlink似乎仅指向内部 GWT 应用程序状态。我想我可以把链接放在 HT
在 GWT 界面中哪个更好,使用带有 javacode 的普通 MVP,还是 UiBinder?从性能、编辑、简单性方面。 最佳答案 这就是Google says : Besides being a
GWT 2.5.0 开发模式 我在下面对文件上传做了一个简单的测试, startupUrl: http://127.0.0.1:8888/UploadTest.html?gwt.codesvr=127
我需要创建一个SuggestBox,在按下时将显示所有选项 Enter键。 我已经写了以下实现,看来是 工作正常。 我希望有人审查我的实现情况,并让我知道 在任何特定情况下都会引起问题。 另外,要传递
在哪里可以找到有关 GWT 和 GWT-Ext 延迟加载的更多信息? 最佳答案 快速谷歌搜索显示 nice blog entry由 GWT 团队提供。 关于 GWT-Ext,我无话可说,但无论采用何种
我是一名优秀的程序员,十分优秀!