【问题标题】:Managed beans with custom ViewScope具有自定义 ViewScope 的托管 bean
【发布时间】:2012-06-08 22:13:56
【问题描述】:

我正在使用 Spring 3.1.0.RELEASE、JSF 2.x、JPA 2 和 Hibernate Provider 做一个 Web 应用程序。我使用 PrettyFaces 3.3.2 作为友好的 URL。该应用程序在 Tomcat 6.35 上运行。

我想使用 Jsf ViewScope 所以我决定按照网上找到的实现:http://comdynamics.net/blog/109/spring3-jsf2-view-scope/

public class ViewScope implements Scope {

    private static final Logger logger = LoggerFactory.getLogger(ViewScope.class);

    @Override
    public Object get(String name, ObjectFactory objectFactory) {
        final Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();

        Object instance = viewMap.get(name);
        if (instance == null) {
            instance = objectFactory.getObject();
            viewMap.put(name, instance);
        }
        return instance;
    }

    @Override
    public Object remove(String name) {
        logger.debug("ViewScope::remove {}", name);
        return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
    }

    @Override
    public String getConversationId() {
        return null;
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        //Not supported
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }
}

我注意到@PreDestroy 没有像显示这个问题@PreDestroy never called on @ViewScoped 那样被调用。

这是否意味着带有 ViewScope 的托管 bean 永远不会被破坏?这导致内存泄漏。我们应该这样使用这个范围吗?

这只发生在 Spring 或 Mojarra 上的自定义 Viewscope 上?

谢谢。

【问题讨论】:

  • 在 mojarra 上调用了 @PreDestroy,至少在我的项目中是这样。我认为如果你使用纯 JSF 2 支持 bean,你会省去很多麻烦。
  • @IturPablo 你在你的项目中使用 Spring 吗?
  • 是的!!!,我可以使用 JSF 标记并使用 @ManageProperty("#{}") 标记访问提供的服务 bean。在我看来,最好使用纯 JSF bean,您可以避免一些麻烦,并且您可以确定您正在使用的 jsf 版本。

标签: spring jsf-2 view-scope


【解决方案1】:

问题是视图范围的实现不正确。它创建 Spring bean objectFactory.getObject(); 但从不销毁它。

要解决它 - 检查 correct implementation 并支持 registerDestructionCallback

BWT,当前的 Mojjara 实现不会在您的 bean too 上调用 @PreDestory。 但它至少会释放 bean 实例。

【讨论】:

    【解决方案2】:

    我尝试使用 Spring 自定义视图范围解决 Jsf 视图范围 bean 内存泄漏问题。它适用于 Jsf 2.1 和 2.2。试试下面链接中的代码。 Memory leak with ViewScoped bean?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2012-03-29
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多