代码之家  ›  专栏  ›  技术社区  ›  Iravanchi

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

  •  17
  • Iravanchi  · 技术社区  · 15 年前

    据我所知,对于使用C中的@annotations(或[attributes]),您必须具有对类元数据的引用,以便可以询问该类是否有注释(attributed)。

    我的问题是,JSF实现如何找到用@managedbean注释的所有类?它扫描类路径中的所有类吗?或者,是否有一种方法可以实际“查询”带有注释的类的JVM?

    我之所以这么问是因为当我直接将带注释的支持bean放到我的Web项目中时,没有问题。但是我在JAR文件中定义的bean(可以跨项目重用)没有注册。有什么我必须告诉我的脸来指导它看哪个JAR文件吗?

    此外,使用注释可以引入许多很好的编程模式。我想知道我是否能找到所有带注释的类…

    2 回复  |  直到 15 年前
        1
  •  24
  •   Community Mohan Dere    9 年前

    我的问题是,JSF实现如何找到用@managedbean注释的所有类?它扫描类路径中的所有类吗?或者,是否有一种方法可以实际“查询”带有注释的类的JVM?

    从窥视周围开始 com.sun.faces.application.annotation.AnnotationManager 在里面 Mojarra 资料来源。请注意,这不是API的一部分,而是特定于实现的。

    如果您打算将这些工具用于自己的项目,我建议使用 Reflections 而不是家庭化。

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

    在JavaEE环境中,更好地是使用CDI来代替。


    我之所以这么问是因为当我直接将带注释的支持bean放到我的Web项目中时,没有问题。但是我在JAR文件中定义的bean(可以跨项目重用)没有注册。有什么我必须告诉我的脸来指导它看哪个JAR文件吗?

    要让JSF从JAR文件加载任何带注释的托管bean,必须将 /META-INF/faces-config.xml JAR文件中的文件。仅与JSF 2.0兼容 <faces-config> 声明足以让JSF扫描JAR文件以查找任何有趣的注释类。如果 /META-INF/faces-config.xml文件 JAR文件中不存在文件,那么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>
    

    把它储存在 META-INF 罐子的文件夹。

    按照第11.4.2章的描述 JSF 2.0 specification .

    11.4.2应用程序启动行为

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

    另请参见:

        2
  •  4
  •   Vivien Barousse    15 年前

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

    这就是为什么您可以将带注释的托管bean放在war文件中,而不是放在jar文件中的原因。

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