JSF如何知道Spring何时管理bean

时间:2014-09-03 23:04:30

标签: spring jsf jsf-2 el

我有这个豆子:

@Component
@RequestScoped
public class Hello {

   @AutoWire
   public DBDao myDao;

   //Getters / Setters
}

当我添加@Component时,该类现在由Spring容器管理,因此它可以为我注入我的DAO。我的问题是,当我在我的JSF文件中使用这个bean,如${hello.myDao}时,Spring或JSF是否为我提供了bean?

如果Spring提供bean,那么当Spring容器管理它时,JSF容器如何知道这个bean?

2 个答案:

答案 0 :(得分:1)

您似乎将JSF与EL混合在一起。那些${}#{}是EL。 EL不是JSF的一部分。 EL是一个独立的API,恰好被JSF和Spring使用。 JSF和Spring都能够在EL范围内放置托管bean实例,以便EL可以找到并调用它。

当你执行#{foo}时,EL将通过一系列已注册的EL解析器传递文字“foo”。如果其中一个可以找到与文字“foo”关联的对象实例,那么它将被返回。有默认的解析器,它们查找与请求/会话/应用程序属性名称相关联的bean实例,例如request.getAttribute("foo")。 JSF使用那些内置解析器。 JSF基本上都是request.setAttribute("foo"),因此EL可以找到它。

Spring有点不同(比如Java EE自己的CDI),因此需要一个自定义的EL解析器,它基本上都是所有已注册的Spring bean的寄存器。当Spring的EL解析器命中时,Spring将在其自己的寄存器中查找与文字“foo”相关联的bean,该注册表在webapp启动时基于@Component填充。如果Spring在其寄存器中找不到匹配“foo”的任何内容,那么它将直接传递到链中的下一个EL解析器。

另见:

答案 1 :(得分:0)

您需要通过添加

告诉FacesServlet查找Spring依赖项
<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

faces-config.xml

假设您的Spring上下文已在运行时正确加载,如果不是,则需要在web.xml添加侦听器以在启动时初始化