JSF 如何查找带有@ManagedBean注释的 bean?

2022-09-02 12:49:23

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

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

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

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


答案 1

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

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

如果您打算将此类工具用于自己的项目,我建议您为此使用Reflections而不是将其本地化。

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

在Java EE环境中,更好的做法是改用CDI。


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

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

以下是最小 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 规范的第 11.4.2 章中描述的。

11.4.2 应用程序启动行为

...

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

另请参阅:


答案 2

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

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

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


推荐