我正在使用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上吗?
感谢。
答案 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?