JSF 托管 bean 中列表的初始化

2024-02-22

我有一个关于 POJO 中 List 初始化的问题,因为它遵循以下代码:

public class Person {

 //other fields...
 private List<String> friends=new ArrayList<>();

     public List<String> getFriends() {
        return friends;
     }
     public void setFriends(List<String> friends) {
        this.friends = friends;
    }

}

或者这样更好,并在其他类中进行初始化(例如 Bean(JSF))

public class Person {

 //other fields...
 private List<String> friends;

     public List<String> getFriends() {
        return friends;
     }
     public void setFriends(List<String> friends) {
        this.friends = friends;
    }

}

所以我的问题是哪种方法更好?


如果它是一个托管 bean,正如你所说,你应该在带有注释的方法中执行此操作@PostConstruct

public class Person {
    private List<String> friends;
    @PostConstruct
    public void init(){
         friends = new ArrayList<String>();
    }

    //getter and setter...
}
  1. 在 JSF 上下文中,通常不赞成在 getter 和 setter 中进行任何初始化的做法。看为什么 JSF 多次调用 getter https://stackoverflow.com/q/2090033/1065197

  2. Also, 根据 API@PostConstruct http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html,该契约指定了安全功能,并保证如果在这样注释的方法中抛出异常,则该 bean 不应投入使用。普通构造函数没有这样的保证。

  3. 在托管 bean 中,注入在构造后立即发生。这意味着您在构造函数中执行的任何操作都不能依赖于任何注入的资源(通过@ManagedProperty)。而在一个@PostConstruct方法,您将可以访问托管 bean 上声明的所有资源

编辑:重要的是要注意只可以有一个人 @PostConstruct对于任何@ManagedBean,所以所有重要的初始化都应该在那里发生。

还值得注意的是,虽然@PostConstruct方法是初始化支持 bean 变量的理想位置/List,这对托管 bean 的范围有影响

  1. @RequestScoped:在具有此注释的托管 bean 中,每次提交相关 JSF 视图时都会调用该方法。 A@RequestScopedbean 会随着每个请求而被销毁并重新创建,这意味着根据您的设置,在@PostConstruct可以在每次请求期间重置为空或默认值。在某些情况下,在 JSF 请求中重新初始化列表可能会出现转换错误。

  2. @ViewScoped:在带有此注释的托管 bean 中,保证您拥有@PostConstruct方法运行一次,当且仅当你正在处理的同一个实例@ViewScoped豆。如果 viewscoped bean 被销毁并重新创建,@PostConstruct方法将再次运行。

  3. @SessionScoped:具有此注释的 bean 创建一次并保持活动状态,直到用户的 HTTP 会话结束。在这种情况下,@PostConstruct方法保证运行一次且仅运行一次,直到 bean 被销毁

See also

  • https://stackoverflow.com/a/3406631/1530938 https://stackoverflow.com/a/3406631/1530938
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 托管 bean 中列表的初始化 的相关文章

随机推荐