【发布时间】: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