玩!框架2.4.x - 注入组件的生命周期

时间:2015-12-15 10:20:18

标签: java playframework dependency-injection

我正在玩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?那么,比方说,我可以缩短这个对象的生命周期吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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

public class MenuManager {

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

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