将JSF Managed Beans移动到Spring bean

时间:2010-08-04 17:47:56

标签: java spring jsf frameworks

我刚刚在一个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,但我想听听其他人我可能面临的问题如果我这样做,或者这种情况的最佳做法是什么。

2 个答案:

答案 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/