Как JSF находит бины, аннотированные @ManagedBean? - PullRequest
18 голосов
/ 15 сентября 2010

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

Мой вопрос: как реализация JSF находит все классы, аннотированные @ManagedBean?Сканирует ли он все классы в пути к классам?Или есть способ на самом деле «запросить» JVM для аннотированных классов?

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

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

Ответы [ 2 ]

25 голосов
/ 15 сентября 2010

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

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

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

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

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


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

Чтобы JSF мог загружать любые аннотированные управляемые bean-компоненты из JAR-файла, вы должны поместитьФайл /META-INF/faces-config.xml в файле JAR.Достаточно только JSF 2.0-совместимого объявления <faces-config>, чтобы JSF сканировал JAR-файл на предмет любых интересных аннотированных классов.Если файл /META-INF/faces-config.xml отсутствует в файле JAR, то JSF не будет сканировать файл JAR для повышения производительности загрузки.

Вот как выглядит файл faces-config.xml, совместимый с минимальным JSF 2.0,

:*
<?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 вместе со связанными средствами визуализации, поэтому оно может объявлять их в ресурсе приложения с именем «/WEB-INF/faces-config.xml» без необходимости программно регистрировать их в приложениипример. Кроме того, приложение может включить библиотеку компонентов (упакованную в файл JAR), которая включает в себя ресурс «META-INF /face-config.xml». Наличие этого ресурса вызываеткомпоненты, средства визуализации и другие классы реализации JSF, которые хранятся в этом JAR-файле библиотеки для автоматической регистрации, без каких-либо действий, требуемых приложением.

См. также:

4 голосов
/ 15 сентября 2010

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

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

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

...