我想为一个JSF-Page使用2个不同的bean(Spring)。我不喜欢将每个方法都写入一个bean,所以我试图分成两个bean,如JobEditDataBean
和JobEditActionBean
。
我想将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...
}
您是否有任何提示或提示如何做得更好,更好?
答案 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