1

我想为一个 JSF 页面使用 2 个不同的 bean(Spring)。我不喜欢将每个方法都写到一个 bean 中,所以我尝试将它们分成两个 bean,比如JobEditDataBeanand JobEditActionBean。我想将 JobEdiDataBean 用作我的数据对象的“容器”,并将操作(如保存、更新等)移动到操作 bean。我现在所做的(以及似乎有效,但感觉不对)如下:

public class JobEditDataBean{
    @Autowired
    JobEditActionBean actionBean;
    // some objects...
    @PostConstruct
    public void init() {
       actionBean.setJobEditDataBean(this);
       // do something ... 
    }
}

public class JobEditActionBean{
    JobEditDataBean dataBean;
    // some objects...
}

你有什么提示或技巧可以做得更好,更好吗?

4

1 回答 1

1

实际上,您不需要每个页面都有一个 bean。您可以为任何页面使用尽可能多的 bean,这很好,因为只要#{someMB}在 XHTML 中找到类似的表达式,JSF 就会找到具有该名称的 bean 并在必要时创建一个新实例。

如果您需要将一个 bean 注入另一个,只需使用@Autowired

@Component
@Scope("request")
public class JobEditActionBean {
    @Autowired
    private JobEditDataBean dataBean;
    @PostConstruct
    public void init() {
        // dataBean.youCanUseDataBeanMethodsHereAlready()
    }
}

您只需要确保两个 bean 都在 Spring 容器中(使用注释即可@Component),并为每个 bean 选择正确的范围。请注意您要注入的 bean 的范围,因为通常只有将更广泛范围的 bean 注入到相同或更多限制范围的 bean 中才有意义。

话虽如此,我建议阅读以下有关选择正确范围的主题:

如何选择合适的bean范围?

还有一件事:这仅在您的 JSF bean 真正由 Spring 容器管理时才有效(这是我在使用后的假设@Autowired)。如果您让 JSF 容器管理 bean(例如使用@ManagedBeanwith@RequestScoped@ViewScoped),则注入它们的方式是使用@ManagedProperty注释:

    ...
    @ManagedProperty("#{jobEditDataBean}")
    private JobEditDataBean dataBean;
于 2012-09-20T09:10:44.570 回答