JSF如何找到用@ManagedBean注释的bean?
问题内容:
据我所知,要使用@Annotations(或C#中的[Attributes]),必须具有对类元数据的引用,以便您可以询问是否对类进行了注释(归因)。
我的问题是,JSF实现如何找到使用@ManagedBean注释的所有类?它会扫描类路径中的所有类吗?还是有一种方法实际上可以“查询” JVM中的带注释的类?
我之所以这样问是因为,当我将带注释的后备bean直接放在Web项目中时,没有问题。但是,我在JAR文件中定义的Bean(可在项目之间重复使用)未注册。我必须告诉MyFaces指导它查看哪些JAR文件吗?
另外,使用注释会引入许多不错的编程模式。我想知道是否能以某种方式找到所有带注释的类…
问题答案:
我的问题是,JSF实现如何找到使用@ManagedBean注释的所有类? 它会扫描类路径中的所有类吗?还是有一种方法实际上可以“查询”
JVM中的带注释的类?
首先com.sun.faces.application.annotation.AnnotationManager
在Mojarra来源中浏览。请注意,这不是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.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>
将其存储在META-INF
JAR 的文件夹中。
这是通过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项目的结构