JSF 如何找到用@ManagedBean 注释的bean?
Posted
技术标签:
【中文标题】JSF 如何找到用@ManagedBean 注释的bean?【英文标题】:How does JSF find beans annotated with @ManagedBean? 【发布时间】:2011-04-12 15:43:45 【问题描述】:据我所知,要使用 @Annotations(或 C# 中的 [Attributes]),您必须引用类元数据,以便您可以询问该类是否已注释(属性)。
我的问题是 JSF 实现如何找到所有使用 @ManagedBean 注释的类?它是否扫描类路径中的所有类?或者有没有办法真正“查询”JVM 中的注释类?
我问这个是因为当我将带注释的支持 bean 直接放在我的 Web 项目中时,没有问题。但是我在 JAR 文件中定义的 bean(可跨项目重用)没有注册。我必须告诉 MyFaces 指示它查看哪些 JAR 文件吗?
此外,使用注解引入了许多不错的编程模式。我想知道我是否能以某种方式找到所有带注释的类...
【问题讨论】:
刚从spring切换到jsf看看怎么样。发现有点疯狂。因为你很久以前就一直在研究它。你觉得它更好吗? 【参考方案1】:我的问题是 JSF 实现如何找到所有使用 @ManagedBean 注释的类?它是否扫描类路径中的所有类?或者有没有办法真正“查询”JVM 中的注释类?
首先在com.sun.faces.application.annotation.AnnotationManager
中查看Mojarra 源。请注意,这不是 API 的一部分,而是特定于实现的。
如果您打算在自己的项目中使用此类工具,我建议您使用 Reflections 而不是自己开发。
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
在 Java EE 环境中,最好使用 CDI。
我问这个是因为当我将带注释的支持 bean 直接放入我的 Web 项目中时,没有问题。但是我在 JAR 文件中定义的 bean(可跨项目重用)没有注册。我必须告诉 MyFaces 指示它查看哪些 JAR 文件吗?
要让 JSF 从 JAR 文件加载任何带注释的托管 bean,您必须将 /META-INF/faces-config.xml
文件放入 JAR 文件中。只需一个与 JSF 2.0 兼容的 <faces-config>
声明就足以让 JSF 扫描 JAR 文件以查找任何有趣的带注释的类。如果 JAR 文件中不存在 /META-INF/faces-config.xml
文件,则 JSF 不会扫描 JAR 文件以提高加载性能。
以下是与 JSF 2.0 兼容的最低 faces-config.xml
文件的外观:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
</faces-config>
将其存储在 JAR 的 META-INF
文件夹中。
这是JSF 2.0 specification的第11.4.2章中描述的方式。
11.4.2 应用程序启动行为
...
该算法为组装基于 JSF 的 Web 组件的开发人员提供了相当大的灵活性 应用。例如,一个应用程序可能包含一个或多个自定义 UIComponent 实现,以及 关联的渲染器,因此它可以在名为“/WEB-INF/faces-config.xml”的应用程序资源中声明它们 无需以编程方式将它们注册到 Application 实例。 此外,应用程序可能会选择 包含一个包含“META-INF/faces-config.xml”资源的组件库(打包为 JAR 文件)。 此资源的存在导致组件、渲染器和其他 JSF 实现类存储在此 库 JAR 文件自动注册,应用程序无需任何操作。
另见:
Structure for multiple JSF projects with shared code【讨论】:
@org: 是 B、a、l、u、s 和 C :) 顺便说一句,只要您想回复帖子的所有者,就不需要@nickname
。任何 cmets 都会通知帖子的所有者。
很好的答案!万分感谢! (我的问题的答案是将 faces-config 文件添加到依赖项 .jar 文件中)【参考方案2】:
实际上,容器会扫描当前 WAR 文件中的所有类。扫描所有类路径会非常耗时且成本高昂。
这就是为什么您可以将带注释的托管 bean 放在 WAR 文件中,而不是放在 JAR 文件中。
如果你真的需要把你的类放在classpath中的一个JAR文件中,你可以使用faces-config.xml
文件告诉JSF哪些类是托管bean。
【讨论】:
不是也可以指定一个JAR文件来扫描吗? 如何指定查看位置? @org:他把faces-context.xml
和faces-config.xml
混淆了。我想你已经知道如何在faces-config.xml
中声明 bean? :)
@BalusC,在哪里指定,在哪里寻找。我不认为它会跳过类路径,他说它只会在战争中寻找,我不认为 jsf 上下文不会寻找类路径。你怎么说balusC?以上是关于JSF 如何找到用@ManagedBean 注释的bean?的主要内容,如果未能解决你的问题,请参考以下文章
无法从xhtml文件,Jsf managedBean访问方法
JSF2.0 Tomcat7中@Named和@ManagedBean注解的区别[重复]
如何在 JSF 2.0/2.1 中用 CDI 替换 @ManagedBean / @ViewScope
如何从 JSF 中的另一个 bean 获取 managedbean 属性