在我的GWT项目中有一个非常简单的GIN用法。我按照Guice教程进行了设置。
我想绑定一个不变的长变量到我的AbstractGinModule子类中的注释。问题是,我现在知道变量的值,直到运行时(onModuleLoad)。在我创建Ginjector之前,我已经有了这个值…我只是不知道如何得到它进入我的客户端模块。
我已经看到的答案说,我可以传递一个构造函数参数到我的ClientModule…但我不知道它是在哪里建造的。这只是注释连接。
@GinModules(MyClientModule.class)
public interface MyGinjector extends Ginjector {
}
public class MyClientModule extends AbstractGinModule {
@Override
protected void configure() {
bindConstant().annotatedWith(named("MyConstant")).to(???);
}
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
long myValue = 123456L;
MyGinjector injector = GWT.create(MyGinjector.class);
}
那么我怎么能得到我的值123456L到MyClientModule的configure()方法?
传递值给GIN的唯一方法是使用共享状态,即一些static
变量/方法,您可以在一侧设置并从您的GinModule
访问/调用
如果在编译时不知道变量的值,那么从技术上讲,它不是常量。另外,如果内存不足,模块类是在编译时使用的,而不是在运行时使用的,所以这种方法不太管用。
当你有值的时候,你能初始化你的变量吗?
您可以遵循的另一种方法是:
@Singleton
public class MyConstants {
private long myLong = null;
public void setLong(long yourLong) {
this.myLong = yourLong;
}
public long getLong() {
return myLong;
}
}
然后在你的EntryPoint得到类:
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
MyGinjector.INSTANCE.getApplication().execute();
}
}
public interface AppInjectorGin extends Ginjector {
@GinModules(MyClientModule.class)
public interface MyGinjector extends AppInjectorGin{
MyGinjector INSTANCE = GWT.create(MyGinjector.class);
AppMain getApplication();
}
//Space for more Injectors if you need them :)
}
public class AppMain {
@Inject MyConstants myConstants;
public void execute() {
long theLong = 12345L;
myConstants.setLong(theLong);
//And now in every single place of your app, if you do
//@Inject MyConstants you will have there the value of the long.
}
}
这里有两个键:
-
MyConstants
类上的@Singleton
注释(否则GIN
将创建一个新实例(always)。 - 类
AppMain
,你需要这样做,否则注入@Inject MyConstants
将为空(如果您尝试直接在EntryPoint
中访问它)。