通过这个教程http://code.google.com/p/google-gin/wiki/GinTutorial的帮助,你的问题看起来并不那么困难。你需要运行几个步骤将菜单实例注入到视图中。
在菜单字段上添加 @Inject 注解。
public ErrorView implements View {
@Inject
private Menu menu;
}
public SearchView implements View {
@Inject
private Menu menu;
}
但在这种情况下,在View对象初始化(在构造函数中)期间,菜单字段将为null。因此,我更喜欢将此字段添加到构造函数参数中。
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构造函数有许多其他参数,它将无法工作,因为所有这些参数都需要被注入。
现在我们必须确保GIN知道ErrorView中的menu字段应该注入到
new Menu(user, userController, -1)
,并且在SearchView中注入到
new Menu(user, userController, 0)
。我们可以通过以下几种方式来实现:
public ErrorView implements View {
@Inject
@Named("errorMenu")
private Menu menu;
}
或者
public ErrorView implements View {
private final Menu menu;
@Inject
public ErrorView(@Named("errorMenu") Menu menu) {
this.menu = menu;
}
}
在你的GIN模块中,你应该提供这个注解的定义。
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);
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 {
}
使用:
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;
}
}
那么就像你定义 @Named("ErrorMenu") 一样来定义注释:
bind(Menu.class).annotatedWith(ErrorMenu.class).to(DefaultErrorMenu.class);
在某些示例中,我将菜单字段设置为final并删除了对它的setter操作,但如果您确实需要菜单的可变状态,可以将其保持不变。