Gwt 使用Gin/Guice注入实例
我的GWT项目中通常有这种代码模式:Gwt 使用Gin/Guice注入实例,gwt,dependency-injection,guice,gwt-gin,Gwt,Dependency Injection,Guice,Gwt Gin,我的GWT项目中通常有这种代码模式: Menu errorMenu = new Menu(user, userController, -1); Menu searchMenu = new Menu(user, userController, 0); errorView.setMenu(errorMenu); searchView.setMenu(searchMenu); 如何使用Gin/Guice在ErrorView和其他“视图”中插入菜单实例: public ErrorView impl
Menu errorMenu = new Menu(user, userController, -1);
Menu searchMenu = new Menu(user, userController, 0);
errorView.setMenu(errorMenu);
searchView.setMenu(searchMenu);
如何使用Gin/Guice在ErrorView
和其他“视图”中插入菜单
实例:
public ErrorView implements View {
// Inject menu instance here
private Menu menu;
}
这样,我就不必手动创建和设置对象了
同样对于
菜单
类,如何注入“user”和“userController”对象,这样我就不必在每次实例化菜单实例时都将其传递给每个菜单实例 在本教程的帮助下,您的问题看起来并不那么难。要将菜单实例注入到视图中,应该执行几个步骤
public ErrorView implements View {
@Inject
private Menu menu;
}
public SearchView implements View {
@Inject
private Menu menu;
}
但在这种情况下,在视图对象初始化期间(在构造函数中),菜单字段将为空。因此,我更喜欢将此字段添加到构造函数参数中
public ErrorView implements View {
private final Menu menu;
@Inject
public ErrorView(Menu menu) {
this.menu = menu;
}
}
public SearchView implements View {
private final Menu menu;
@Inject
public SearchView(Menu menu) {
this.menu = menu;
}
}
当然,如果在ErrorView的构造函数中有许多其他参数,那么它将不起作用,因为所有这些参数都需要被注入新菜单(用户,用户控制器,-1)
和中的另一个
搜索查看到-新菜单(用户、用户控制器、0)
。我们可以做到
通过以下几种方式:
- 将注释
和@Named(“searchMenu”)
添加到菜单字段中@Named(“errorMenu”)
或 在GIN模块中,您应该提供此注释的定义public ErrorView implements View { @Inject @Named("errorMenu") private Menu menu; }
public class ApplicationGinModule extends AbstractGinModule { protected void configure() { bind(Menu.class).annotatedWith(Names.named("errorMenu")).to(DefaultErrorMenu.class); bind(Menu.class).annotatedWith(Names.named("searchMenu")).to(DefaultSearchMenu.class); //assume that User and UserController classes have default constructors //otherwise you should provide correct injection depending on your business-logic bind(User.class).in(Singleton.class); bind(UserController.class).in(Singleton.class); } } public class DefaultErrorMenu extends Menu { @Inject public DefaultErrorMenu(User user, UserController userController) { super(user, userController, -1); } } public class DefaultSearchMenu extends Menu { @Inject public DefaultSearchMenu(User user, UserController userController) { super(user, userController, 0); } }
- 为菜单字段创建自己的注释
和@SearchMenu
,并在模块中定义它们 注释示例:@ErrorMenu
用法:@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE}) @BindingAnnotation public @interface ErrorMenu { }
或 然后按照定义@Named(“ErrorMenu”)的方式定义注释:public ErrorView implements View { @Inject @ErrorMenu private Menu menu; }
在某些示例中,我将菜单字段设为final并删除setter,但如果您确实需要菜单的可变状态,则可以将其保持不变。因为在我的应用程序中只有一个User和UserController实例,所以有没有办法在“public class DefaultErrorMenu extends menu”中也插入它用户和用户控制器也被注入了吗?在我的控制器类中,我通常有这样的模式:XyzController(最终应用程序,最终xyzmodel模型)用户和用户控制器对象将被注入,如果:1)它们有没有参数的默认构造函数,2)它们有@Inject注释,它们在您的GinModule类中有描述:bind(User.class)。somethingelse…..我不明白它是什么模式?无论如何,您应该将@Inject注释添加到XyzController类的构造函数中。顺便说一句,我也修改了这段代码来注入我的应用程序模型,但是当访问使用绑定(UserModel.class)注入@Inject和绑定的模型时,它会抛出NullPointerException;
public ErrorView implements View {
@Inject
@ErrorMenu
private Menu menu;
}
public ErrorView implements View {
private final Menu menu;
@Inject
public ErrorView(@ErrorMenu Menu menu) {
this.menu = menu;
}
}
bind(Menu.class).annotatedWith(ErrorMenu.class).to(DefaultErrorMenu.class);