JSF如何知道Spring何时管理bean

JSF如何知道Spring何时管理bean,spring,jsf,jsf-2,el,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,那么当它

我有这个豆子:

@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呢?

您需要告诉
FacesServlet
通过添加

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

org.springframework.web.jsf.el.SpringBeanFacesELResolver
到您的
faces config.xml


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

您似乎将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的做法有点不同(像JavaEE自己的CDI),因此需要一个定制的EL解析器,它基本上有一个所有注册Springbean的寄存器。当Spring的EL解析器被命中时,Spring将在其自己的寄存器中查找与文本“foo”相关联的bean,该寄存器在webapp启动期间根据
@组件
填充。如果Spring在其寄存器中找不到任何匹配“foo”的内容,那么它将直接传递到链中的下一个EL解析器

另见:
  • -自定义EL解析器示例
  • -另一个自定义EL解析器示例

我有所有的配置文件设置,一切正常。我只想知道哪个容器正在管理我的
Hello
bean。
Spring
如果它们都有相同的bean名称,那么尝试哪一个优先或哪一个冲突会很有趣。@BalusC。这确实有助于回答我提出的问题和我不知道如何提问的未提出的问题。非常感谢。