使用自定义ViewScope管理的bean

时间:2012-06-04 20:43:19

标签: spring jsf-2 view-scope

我正在使用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的自定义Viewscope或Mojarra上吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

要解决此问题,请检查correct implementation是否支持registerDestructionCallback

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

答案 1 :(得分:0)

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