19

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

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

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

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

4

2 回答 2

25

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

查看 Mojarracom.sun.faces.application.annotation.AnnotationManager资源开始。请注意,这不是 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 文件以查找任何有趣的带注释的类。如果/META-INF/faces-config.xmlJAR 文件中不存在该文件,则 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-INFJAR 的文件夹中。

这在JSF 2.0 规范的第 11.4.2 章中有所描述。

11.4.2 应用程序启动行为

...

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

也可以看看:

于 2010-09-15T12:53:40.393 回答
4

实际上,容器会扫描当前 WAR 文件中的所有类。扫描所有类路径将非常耗时且成本高昂。

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

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

于 2010-09-15T12:15:39.143 回答