我刚刚在一个JSF Web应用程序中介绍了Spring,现在我很想通过将这些bean转移到contextConfigLocation XML文件(指定org.springframework.web.jsf.el)来将我的JSF托管bean转换为Spring bean。 faces-config.xml中的SpringBeanFacesELResolver,而不是faces-config.xml文件中的bean。
如果我转向使用Spring bean(比如获取依赖注入功能),我会看到很多优点与JSF bean相比,所以我几乎不能反对转向Spring bean,但我想听听其他人我可能面临的问题如果我这样做,或者这种情况的最佳做法是什么。
答案 0 :(得分:5)
唯一的主要问题可能是你将JSF与Spring紧密耦合,并且如果没有Spring,你的JSF视图/模型可能不再可用。唯一可行的替代方案是升级到JSF 2.0 / Java EE 6并使用Java EE 6提供的依赖注入工具,而不是依赖于第三方DI框架。另一方面,当前的优点是合理的。你可以这样做。
答案 1 :(得分:2)
不要将JSF托管bean移动到Spring bean。 JSF和Spring bean生命周期(范围)完全不匹配。例如,Spring Framework中缺少视图范围和会话范围。
相反,将JSF支持bean保留为JSF管理的bean,并将Spring bean自动装配到它们上。
为JSF支持bean定义一个抽象超类,如下所示:
public abstract class AutowireableManagedBean {
protected AutowireCapableBeanFactory ctx;
@PostConstruct
protected void init() {
logger.debug("init");
ctx = WebApplicationContextUtils
.getWebApplicationContext(
(ServletContext) FacesContext.getCurrentInstance()
.getExternalContext().getContext())
.getAutowireCapableBeanFactory();
// The following line does the magic
ctx.autowireBean(this);
}
...
}
然后,让你的支持bean扩展该超类,你将能够自动装配Spring bean并使用特定于JSF的视图范围:
@ManagedBean
@ViewScoped
public class MyBackingBean extends AutowireableManagedBean {
@Autowired
private MyDao myDao;
本文的更多信息:http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/