Ответ 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 файл, который будет автоматически зарегистрирован, без каких-либо действий, требуемых приложением.