我在请求作用域中定义了JSF处理程序,如下所示
public class JsfHandler {
private List<ManagedBean> managedBeanList; // managed bean List in session scope
}
<managed-bean>
<managed-bean-name>jsfHandler</managed-bean-name>
<managed-bean-class>com.test.JsfHandler</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>managedBeanList</property-name>
<value>#{managedBeanList}</value>
</managed-property>
</managed-bean>我在JSF中有一个会话范围的JSF托管bean列表,定义如下。
<managed-bean>
<managed-bean-name>managedBeanList</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>方法1:
managedBeanList.clear();
managedBeanList.addAll(service.getResultList());
// assuming service.getResultList() would return a new ArrayList();方法2:
managedBeanList = service.getResultList();
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("managedBeanList",managedBeanList);我们目前使用的是方法1。
方法2正确吗?在appraoch 2中调用Java Garabage收集器时,在内存使用方面是否有任何优势。
发布于 2011-10-22 04:22:29
两者都不正确。该列表必须是会话范围的托管bean的属性。您应该尽可能避免手动修改会话映射。
两者都不比另一个更“GC友好”。在方法1中,您最终得到了一个由service.getResultList()返回的列表中未引用的实例。在方法2中,您最终得到了列表的一个未引用的实例,该实例以前由managedBeanList引用。在这两种情况下,GC都必须做相同的工作:清理未引用的实例。
https://stackoverflow.com/questions/7854755
复制相似问题