我的问题是,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.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项目的结构



