将JSF托管的Bean转移到Spring Bean

6
我刚在JSF Web应用程序中引入了Spring,现在我很想将我的JSF托管bean转换为Spring bean,通过将这些bean移动到contextConfigLocation XML文件中(在faces-config.xml中指定org.springframework.web.jsf.el.SpringBeanFacesELResolver),而不是在faces-config.xml文件中拥有这些bean。

如果我转移到Spring bean,我会看到很多优点(例如获得依赖注入功能),与JSF bean相比,所以我几乎不能反对转移到Spring bean,但我想听听其他人的意见,如果我这样做会面临哪些问题,或者在这种情况下最佳实践是什么。

2个回答

5

唯一的主要问题可能是您将JSF与Spring紧密耦合,并且您的JSF视图/模型可能不再可重用而没有Spring。唯一可行的替代方案是升级到JSF 2.0 / Java EE 6,并利用Java EE 6提供的依赖注入功能,而不是依赖于第三方DI框架。另一方面,当前的优势是明显的。你可以这样做。


目前无法使用Java EE 6,我只能使用Java EE 5。我想我会尝试将我的JSF后备bean保持为JSF托管bean,对于业务逻辑和其他服务,我将使用Spring...我还没有检查过,但也许可以在faces-config.xml中声明bean,但在某个地方进行配置,以便这些bean实际上由Spring处理(也许我说了一些愚蠢的话,我相对较新于Spring,我声明bean的方式是使用contextConfigLocation文件)。 - Abel Morelos
如果您想在Eclipse中为Spring beans启用自动完成功能,请参见https://dev59.com/3qnka4cB1Zd3GeqPLkYh。 - Thies

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/

该链接介绍了如何很好地整合JSF 2和Spring 3,以便更好地开发IT技术。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接