1

我正在使用 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 从未调用过 @ViewScoped

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

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

谢谢。

4

2 回答 2

1

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

要解决它 -检查支持registerDestructionCallback.

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

于 2013-03-14T13:28:42.090 回答
0

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

于 2014-02-05T17:13:00.400 回答