【问题标题】:Play! framework 2.4.x - lifecycle of injected components玩! framework 2.4.x - 注入组件的生命周期
【发布时间】: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


【解决方案1】:

问题在于 Play 控制器是单例的,如下所述:

https://stackoverflow.com/a/34867199/4600

因此,您的 MenuManager 只被注入一次并重用每个请求。此外,由于每次调用 menuVoices 方法时都会填充菜单列表,因此每次在 MenuManager 的同一实例中调用该方法时,iten 列表都会增长。如果您像下面这样重写您的服务,它将按预期工作:

public class MenuManager {

    private List<String> voices = Arrays.asList(
        "Voice_1",
        "Voice_2",
        "Voice_3"
    );

    public List<String> menuVoices() {
        return voices;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2021-02-07
    • 2017-06-04
    相关资源
    最近更新 更多