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

时间:2010-09-15 12:03:36

标签: java annotations jsf-2 managed-bean

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

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

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

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

2 个答案:

答案 0 :(得分:25)

  

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

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

如果您打算将这些工具用于您自己的项目,我建议您使用Reflections代替家庭投放。

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

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


  

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

要让JSF从JAR文件加载任何带注释的托管bean,您必须在JAR文件中放置/META-INF/faces-config.xml文件。只需一个JSF 2.0兼容的<faces-config>声明就足以让JSF扫描任何有趣的带注释类的JAR文件。如果JAR文件中不存在/META-INF/faces-config.xml文件,则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>

将其存储在JAR的META-INF文件夹中。

这是JSF 2.0 specification第11.4.2节所述的方式。

  

11.4.2应用程序启动行为

     

...

     

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

另见:

答案 1 :(得分:4)

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

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

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