【问题标题】:Myfaces CODI, @Inject and memory usageMyfaces CODI、@Inject 和内存使用情况
【发布时间】:2011-12-01 19:22:24
【问题描述】:

我在我的 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,那么当我访问 #{page2Bean.target} 时 page2 的值为“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 的 bean 之一时才会使用内存 运行时间?

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

感谢您的澄清。

【问题讨论】:

    标签: jsf myfaces codi


    【解决方案1】:

    好吧,我想这真的很明显,但是在使用 @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() 和 @PreDestroy 方法放入 Page2Bean 我看到它们都被调用了 按预期从 page2 导航到 page1。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 从文档中我认为@WindowScoped 看起来有点沉重,它说它就像每个窗口一个会话,同时删除所有 bean。至于以错误的方式使用它,我一直在尝试自己弄清楚,虽然现有的文档非常有用,但我发现它并没有以大图为导向。
      • 不可能有大局,因为这取决于你。但是将它用于不相关的页面只是为了传递参数是没有意义的。它用于保持绑定到用例(例如)的具体状态。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2012-11-11
      • 2011-12-09
      • 2013-04-23
      • 2013-06-08
      • 2013-04-20
      相关资源
      最近更新 更多