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

Ira*_*chi 18 java annotations jsf-2 managed-bean

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

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

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

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

Bal*_*usC 25

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

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

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

Set<Class<?>> classes = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
Run Code Online (Sandbox Code Playgroud)

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


我问这个是因为当我直接在我的web项目中添加带注释的支持bean时,没有问题.但我在JAR文件中定义的bean(可跨项目重用)未注册.有什么东西我必须告诉MyFaces指导它看哪个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>
Run Code Online (Sandbox Code Playgroud)

将其存储在META-INFJAR 的文件夹中.

这是按照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实现类自动注册,而不需要应用程序执行任何操作.

也可以看看: