Как JSF находит beans с аннотацией с @ManagedBean?

Насколько я знаю, для использования @Annotations (или [Attributes] в С#) вы должны иметь ссылку на метаданные класса, чтобы вы могли спросить, аннотирован класс (приписывается) или нет.

Мой вопрос в том, как реализация JSF находит все классы, аннотированные с помощью @ManagedBean? Проверяет ли он все классы в пути к классу? Или существует способ "запросить" JVM для аннотированных классов?

Я спрашиваю об этом, потому что, когда я помещаю свою аннотированную поддержку beans в свой веб-проект напрямую, проблем нет. Но beans, который я определяю в файлах JAR (которые можно использовать повторно для проектов), не регистрируется. Есть ли что-то, что я должен сказать MyFaces, чтобы направить его, какие файлы JAR посмотреть?

Кроме того, использование аннотаций представляет много хороших шаблонов программирования. Я хочу знать, могу ли я как-нибудь найти все аннотированные классы...

Ответы

Ответ 1

Мой вопрос в том, как реализация JSF находит все классы, аннотированные с помощью @ManagedBean? Проверяет ли он все классы в пути к классу? Или существует способ "запросить" JVM для аннотированных классов?

Начните с просмотра com.sun.faces.application.annotation.AnnotationManager в Mojarra источники. Обратите внимание, что это не часть API, а специфичная для реализации.

Если вы намереваетесь использовать такие инструменты для своих собственных проектов, я рекомендую использовать Reflections для этого, а не для его homegrowing.

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

В среде Java EE лучше всего использовать CDI.


Я спрашиваю об этом, потому что, когда я помещаю свою аннотированную поддержку beans в свой веб-проект напрямую, проблем нет. Но beans, который я определяю в файлах JAR (которые можно использовать повторно для проектов), не регистрируется. Есть ли что-то, что я должен сказать MyFaces, чтобы направить его, какие файлы JAR посмотреть?

Чтобы JSF загрузил любой аннотированный управляемый beans из JAR файла, вы должны поместить файл /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.

Это, как описано в главе 11.4.2 спецификация JSF 2.0.

11.4.2 Поведение при запуске приложения

...

Этот алгоритм обеспечивает значительную гибкость для разработчиков, которые собирают компоненты веб-сайта на основе JSF выражение. Например, приложение может включать одну или несколько пользовательских реализаций UIComponent, а также связанных с Renderers, поэтому он может объявить их в ресурсе приложения с именем "/WEB-INF/faces-config.xml", без необходимости программно регистрировать их с помощью экземпляра приложения. Кроме того, приложение может выбрать для включения библиотеки компонентов (в виде файла JAR), который включает в себя ресурс "META-INF/faces-config.xml". Существование этого ресурса заставляет компоненты, средства визуализации и другие классы реализации JSF, которые хранятся в этом библиотечный JAR файл, который будет автоматически зарегистрирован, без каких-либо действий, требуемых приложением.

См. также:

Ответ 2

Фактически, контейнер сканирует все классы в текущем файле WAR. Сканирование всего пути к классам будет очень долгим и дорогостоящим.

Вот почему вы можете поместить аннотированный управляемый beans в WAR файл, а не в JAR файл.

Если вам действительно нужно поместить ваши классы в JAR файл в путь к классам, вы можете использовать файл faces-config.xml, чтобы сообщить JSF, какие классы управляются bean.