在jsf中使用不同bean的策略

时间:2012-09-20 08:41:25

标签: java spring jsf jsf-2 javabeans

我想为一个JSF-Page使用2个不同的bean(Spring)。我不喜欢将每个方法都写入一个bean,所以我试图分成两个bean,如JobEditDataBeanJobEditActionBean。 我想将JobEdiDataBean用作我的数据对象的“容器”,并将actionstuff(如保存,更新等)移动到action 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...
}

您是否有任何提示或提示如何做得更好,更好?

1 个答案:

答案 0 :(得分:1)

实际上,每页不需要一个bean。你可以为任何页面使用你想要的bean,这很好,因为每当在你的XHTML中找到像#{someMB}这样的表达式时,JSF会找到一个具有该名称的bean,并在必要时创建一个新实例。 p>

如果您需要将一个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才有意义。

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

How to choose the right bean scope?

还有一件事:只有当你的JSF bean真的由Spring容器管理时才有效(这是我使用@Autowired后的假设)。如果您让JSF容器管理bean(例如,使用带有@ManagedBean@RequestScoped的{​​{1}}),则注入它们的方式是使用@ViewScoped注释:

@ManagedProperty