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


问题内容

据我所知,要使用@Annotations(或C#中的[Attributes]),必须具有对类元数据的引用,以便您可以询问是否对类进行了注释(归因)。

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

我之所以这样问是因为,当我将带注释的后备bean直接放在Web项目中时,没有问题。但是,我在JAR文件中定义的Bean(可在项目之间重复使用)未注册。我必须告诉MyFaces指导它查看哪些JAR文件吗?

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


问题答案:

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

首先com.sun.faces.application.annotation.AnnotationManagerMojarra来源中浏览。请注意,这不是API的一部分,而是特定于实现的。

如果您打算将此类工具用于自己的项目,则建议对此使用“
反射”,而不是自行开发。

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实现以及关联的Renderer,因此它可以在名为“
/WEB-INF/faces-config.xml”的应用程序资源中声明它们,而无需通过编程方式在Application中注册它们。实例。
另外,应用程序可能选择包括一个组件库(打包为JAR文件),该组件库包含“ META-INF / faces-config.xml”资源。
此资源的存在将导致自动注册存储在此库JAR文件中的组件,渲染器和其他JSF实现类,而应用程序无需执行任何操作。

也可以看看:

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