【问题标题】:How does JSF know when a bean is being managed by SpringJSF 如何知道 bean 何时由 Spring 管理
【发布时间】:2014-10-28 13:57:23
【问题描述】:

我有这个豆子:

@Component
@RequestScoped
public class Hello {

   @AutoWire
   public DBDao myDao;

   //Getters / Setters
}

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

如果是 Spring 提供 bean,那么 JSF 容器在 Spring 容器管理该 bean 时如何知道它?

【问题讨论】:

    标签: spring jsf jsf-2 el


    【解决方案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 解析器。

    另见:

    【讨论】:

    • 一如既往的惊人答案@BalusC。这确实有助于回答我提出的问题和我不知道如何提出的未提出的问题。谢谢!
    【解决方案2】:

    您需要告诉FacesServlet 也可以通过添加来查找 Spring 依赖项

    <application>
        <el-resolver>
            org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application>
    

    致您的faces-config.xml

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

    【讨论】:

    • 我已经完成了所有的配置文件设置并且一切正常。我只想知道哪个容器正在管理我的Hello bean。
    • Spring 如果它们都具有相同的 bean 名称,那么尝试一下哪个优先或冲突会很有趣
    猜你喜欢
    • 2018-01-22
    • 2014-07-01
    • 2011-09-12
    • 1970-01-01
    • 2012-11-09
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多