Myfaces CODI,@ Inject和内存使用情况

时间:2011-12-01 19:22:24

标签: jsf myfaces codi

我在我的JSF应用程序中使用Myfaces CODI @ViewAccessScoped支持bean。其中一个 好处是我不需要使用视图参数来交换信息 观点。对于记录,@ ViewAccessScoped确保可访问bean,直到新视图的第一个请求不访问它为止。假设我想将第1页的字符串值传递给第2页:

Page1Bean.java(page1.xhtml的支持bean)

@Inject private Page2Bean page2Bean;
private String source = "Hello, World!";

...
page2Bean.setTarget(source);

Page2Bean.java(page2.xhtml的支持bean)

private String target;

如果我直接从page1导航到page2,那么当我从中访问#{page2Bean.target}时 page2它的值为“hello,world!”。

实际上我正在将数据从page1视图推送到page2视图。另一种选择是 将数据从page1视图拉入page2视图,所以在page2Bean中我@Inject Page1Bean和@ViewAccessScoped确保我可以访问page1Bean.getSource()(只要 正如之前的观点一样。)

这一切都很好,但在现实世界中,我可能想要从第1页导航到任何页面 许多其他页面之一,具体取决于用户输入。所以Page1Bean.java结束了 像这样:

Page1Bean.java(已修订)

@Inject private Page2Bean page2Bean;
@Inject private Page3Bean page3Bean;
@Inject private Page4Bean page4Bean;
@Inject private Page5Bean page5Bean;
@Inject private Page6Bean page6Bean;
@Inject private Page7Bean page7Bean;
@Inject private Page8Bean page8Bean;

现在我的问题是:page1Bean的内存占用总是包含page2Bean- page8Bean?或者只有在我访问其中一个@Inject'ed bean时才会使用内存 运行

我希望这不是一个太天真的问题,但我不确定它究竟是如何起作用的 如果第一个问题的答案是肯定的,我或多或少会最终使用 @SessionScoped!

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:0)

好吧,我认为这很明显,但是在使用@Inject注入的bean的构造函数中进行了一些日志记录,我可以看到它们在实例化Page1Bean时被实例化,即导航到第1页。我在JSR-299 CDI规范5.6节程序查找中找到了解决方案:

@Inject private Instance<Page2Bean> page2BeanDynamic;
...
if(someCondition) {
  Page2Bean page2Bean = page2BeanDynamic.get();
  page2Bean.setTarget(source);
}

所以这基本上是动态的@Inject,并确保我只是实例化bean 在运行时需要。

推出finalize()&amp; Page2Bean中的@PreDestroy方法我看到它们都被调用了 正如预期的那样,从第2页导航到第1页。

答案 1 :(得分:0)

没有真正的内存占用。仅生成代理。这就是构造函数调用的原因。您无需手动解析bean!

您不必注入所有bean。你是以错误的方式使用它。只需保持_独立_页面之间的状态应该通过@WindowScoped来完成。如果它们不是独立的,则使用目标页面中的bean(如果您不需要目标页面中的视图控制器回调)。