当前位置: 首页 > 面试题库 >

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

孙修贤
2023-03-14
问题内容

据我所知,要使用@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.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项目的结构


 类似资料:
  • 我目前正在使用RichFaces评估Java EE6/JSF2.1。 声明为 获取ID集(准备删除操作)。 通过JSF显示一个确认弹出窗口。 如果用户确认,则调用delete方法并删除在步骤1中存储ID的行。 是否必须使用和方法? 如果是的话,哪里才是调用它们的好地方呢?

  • 我在尝试执行此代码时遇到以下错误。 java.lang.IllegalArgumentException:在“com.app.aggregatorappaconfiguration”上找不到ConfigurationProperties注释。在org.springframework.util.assert.NotNull(assert.java:115)~[spring-core-4.3.2.re

  • 我有这个spring配置: 如何获取用Foo注释的所有bean的列表? 注意:

  • 问题内容: 注释有两种样式,C样式和C ++样式,如何识别它们? 我可以随意使用任何方法和第3库。 问题答案: 为了可靠地在Java源文件中找到所有注释,我不会使用regex,而是使用真正的词法分析器(aka Tokenizer)。 Java的两个流行选择是: JFlex:http://jflex.de ANTLR:http://www.antlr.org 与流行的看法相反,ANTLR也可用于 仅

  • 问题内容: 我为方法提供了一个简单的标记注释(类似于 有效Java (第2版)第35条中的第一个示例): 然后,在给定的包(例如)中,它有一些包含20个类的子包,我想找到所有带有注释的方法。(因为我想对单元测试中所有带注释的方法进行一些检查。) 最简单的方法是什么?最好不要添加新的第三方库或框架。 编辑 :进行澄清,显然将是检查方法是否具有注释的方法- 但此问题包括查找所有方法。 问题答案: 如果

  • 这可能是一个很难回答的问题,但是在很多教程和示例中,我看到这些注释的使用就好像它们做了同样的事情。 但是,我使用时遇到了一些限制(尤其是依赖注入等),我找不到解释差异的源,如果有人能给出一个大致的概述,说明什么时候使用这两个,我将非常感谢。