JSF如何找到使用@ManagedBean注释的bean?

据我所知,对于使用@Annotations(或C#中的[Attributes]),您必须引用类元数据,以便您可以询问该类是否已注释(属性)。

我的问题是JSF实现如何找到所有使用@ManagedBean注释的类? 它是否扫描类路径中的所有类? 或者有没有办法实际“查询”JVM的注释类?

我问这个是因为当我直接在我的web项目中添加带注释的支持bean时,没有问题。 但我在JAR文件中定义的bean(可跨项目重用)未注册。 有什么东西我必须告诉MyFaces指导哪些JAR文件看?

此外,使用注释引入了许多不错的编程模式。 我想知道我是否能以某种方式找到所有带注释的类……

我的问题是JSF实现如何找到所有使用@ManagedBean注释的类? 它是否扫描类路径中的所有类? 或者有没有办法实际“查询”JVM的注释类?

首先在Mojarra源代码中的com.sun.faces.application.annotation.AnnotationManager中查看 。 请注意,这不是API的一部分,而是特定于实现的。

如果您打算将这些工具用于您自己的项目,我建议您使用Reflections来代替Homegrowing。

 Set> classes = reflections.getTypesAnnotatedWith(SomeAnnotation.class); 

在Java EE环境中,更好的是使用CDI。


我问这个是因为当我直接在我的web项目中添加带注释的支持bean时,没有问题。 但我在JAR文件中定义的bean(可跨项目重用)未注册。 有什么东西我必须告诉MyFaces指导哪些JAR文件看?

要让JSF从JAR文件加载任何带注释的托管bean,您必须将/META-INF/faces-config.xml文件放在JAR文件中。 只需一个JSF 2.0兼容的声明就足以让JSF扫描任何有趣的带注释类的JAR文件。 如果JAR文件中不存在/META-INF/faces-config.xml文件,则JSF将不扫描JAR文件以提高加载性能。

以下是与JSF 2.0兼容的最小faces-config.xml文件的外观:

    

将其存储在JAR的META-INF文件夹中。

这是按照JSF 2.0规范的第11.4.2章中描述的方式进行的。

11.4.2应用程序启动行为

该算法为组装基于JSF的Web应用程序的组件的开发人员提供了相当大的灵活性。 例如,应用程序可能包含一个或多个自定义UIComponent实现以及关联的Renderers,因此它可以在名为“/WEB-INF/faces-config.xml”的应用程序资源中声明它们,而无需以编程方式将它们与Application一起注册。实例。 此外,应用程序可能会选择包含一个包含“META-INF / faces-config.xml”资源的组件库(打包为JAR文件)。 此资源的存在会导致存储在此库JAR文件中的组件,呈现器和其他JSF实现类自动注册,而不需要应用程序执行任何操作。

也可以看看:

  • 具有共享代码的多个JSF项目的结构

实际上,容器会扫描当前WAR文件中的所有类。 扫描所有类路径将是非常漫长和昂贵的。

这就是为什么你可以将带注释的托管bean放在WAR文件中,而不是放在JAR文件中。

如果您确实需要将类放在类路径中的JAR文件中,则可以使用faces-config.xml文件告诉JSF哪些类是托管bean。