据我所知,对于使用@Annotations(或C#中的[Attributes]),您必须引用类元数据,以便您可以询问该类是否已注释(属性)。
我的问题是JSF实现如何查找所有使用@ManagedBean注释的类?它是否扫描类路径中的所有类?或者有没有办法实际“查询”JVM的注释类?
我问这个是因为当我直接在我的web项目中添加带注释的支持bean时,没有问题。但我在JAR文件中定义的bean(可跨项目重用)未注册。有什么东西我必须告诉MyFaces指导哪些JAR文件看?
此外,使用注释会引入许多不错的编程模式。我想知道我是否能以某种方式找到所有带注释的类......
答案 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。