0

我在我的 JSF 应用程序中使用 Myfaces CODI @ViewAccessScoped 支持 bean。好处之一是我不需要使用视图参数来在视图之间传递信息。作为记录,@ViewAccessScoped 确保 bean 是可访问的,直到新视图的第一个请求不访问它。以我想将字符串值从 page1 传递到 page2 的情况为例:

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,那么当我从 page2 访问 #{page2Bean.target} 时,它的值是“hello, world!”。

实际上,我将数据从 page1 视图推送到 page2 视图。另一种选择是将数据从 page1 视图拉到 page2 视图中,因此在 page2Bean 中我 @Inject Page1Bean 和 @ViewAccessScoped 确保我可以访问 page1Bean.getSource() (只要它在前一个视图中)。

这一切都很好,但在现实世界中,我可能想从 page1 导航到许多其他页面中的任何一个,具体取决于用户输入。所以 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!。

感谢您的任何澄清。

4

2 回答 2

0

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

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

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

将 finalize() 和 @PreDestroy 方法放入 Page2Bean 我看到它们在从 page2 导航到 page1 时都被调用,正如预期的那样。

于 2011-12-02T13:01:33.473 回答
0

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

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

于 2011-12-02T13:43:51.257 回答