【发布时间】:2015-12-15 10:20:17
【问题描述】:
我正在使用 Play!框架,我在这个控制器中注入的组件有问题:
public class Admin extends Controller {
@Inject
MenuManager menuManager;
public Result adminHome(){
return ok(views.html.admin_area.adminHome.render(menuManager.menuVoices()));
}
}
操作 adminHome 显示我的 Web 应用程序的主页,我将menuManager 组件作为服务注入。
这是 MenuManager 类的代码:
public class MenuManager {
private ArrayList<String> voices;
public MenuManager(){
voices = new ArrayList<String>();
}
public List<String> menuVoices(){
voices.add("Voice_1");
voices.add("Voice_2");
voices.add("Voice_3");
return voices;
}
}
我要渲染的视图是这样的:
@(menuVoices: List[String])
<div>
@for(voice <- menuVoices){
<div>@voice</div>
}
</div>
我无法理解注入对象的生命周期:menuManager。
我会试着解释这个问题。当我加载主页时,我看到三个声音的菜单。如果我重新加载页面,我会看到另外三个声音,这种情况在我第一次之后每次重新加载页面时都会发生。发生这种情况是因为当我调用操作 adminHome() 时,对象 menuManager 没有被重新实例化,所以我在渲染之前将相同的三个声音添加到列表中。
解决此问题的方法是在每次创建菜单时重新创建列表,方法为 menuVoices,但我不知道这是否是正确的继续方式。
有没有一种方法可以强制控制器在我每次调用操作时重新实例化对象而不修改类 MenuManager?那么,比方说,我可以缩短这个对象的生命周期吗?
提前谢谢你
【问题讨论】:
-
你没有注意到带有
@Singleton注释的MenuManager类吗?.. -
是的,我已经做到了,但结果是一样的:(
-
你检查控制器实例是不是每个请求都是唯一的?玩 2.4?
-
不,我该怎么做??
-
System.out.println(this.toString());在您的 adminHome() 操作中。在控制台中,您将看到每个请求的不同对象 hashCode@7ba0d59f。
标签: java playframework dependency-injection