Подтвердить что ты не робот

Spring пространства имен XML: как найти, какие классы реализации позади них?

В моем приложении Spring 3.1 мне иногда нужно изменить поведение по умолчанию некоторых пространств имен Spring в моих контекстных файлах. Для этого я создаю пользовательские классы, реализующие некоторые интерфейсы или расширяющие классы по умолчанию Spring.

Но мне трудно точно узнать, какие классы, которые Spring использует за своими пространствами имен! Каковы шаги, необходимые для их поиска?

Например, пространство имен безопасности:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                           http://www.springframework.org/schema/security 
                           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

и что-то вроде:

<sec:http>
    ...
    <sec:logout />
</sec:http>

Как узнать, какие классы используются в пространстве имен "< sec: logout/" > "? Я не нахожу информацию, глядя на http://www.springframework.org/schema/security/spring-security-3.1.xsd!

Где я должен смотреть?

4b9b3361

Ответ 1

Каждое пространство имен Spring имеет связанную NamespaceHandler реализацию. Схемы пространства имен сопоставляются с файлами схемы внутри Spring JAR в различных файлах spring.schemas (см. Также Spring DI applicationContext.xml, как именно используется xsi: schemaLocation?).

Пространства имен схем XML также отображаются на классы обработчиков в файлах spring.handlers (несколько, поскольку каждый Spring JAR может вводить разные пространства имен). Для вашего удобства здесь приведен список наиболее распространенных пространств имен:

Spring Ядро

Spring Безопасность

Spring интеграция

Если вы перейдете к источнику каждого из этих классов, вы быстро обнаружите различные реализации BeanDefinitionParser, отвечающие за разбор фактических определений XML.

Ответ 2

Почти все из них называются *BeanDefinitionParser. Первый шаг: использовать ваш браузер, вызвать Spring JavaDocs и нажать <Ctrl>-F (или <Command>-F). Найдите BeanDefinitionParser. Из классов, которые соответствуют, один или два будут, по их именам, выглядеть так, как будто они обрабатывают элементы пространства имен, которые вы исследуете. Может потребоваться немного посмотреть исходный код на эти классы, но в конечном итоге вы найдете то, что хотите.

Кроме того, в вашей среде IDE вы можете перейти к BeanDefinitionParser.java, а затем выполнить "Найти использование" (IntelliJ) или "Иерархия типов" (Eclipse), чтобы найти всех разработчиков этого интерфейса. Существует несколько классов, которые не соответствуют соглашению об именах *BeanDefinitionParser. Ваша IDE предоставит вам исчерпывающий список.

Я думаю, что Spring должен фактически документировать в разделе Namespace своих ссылочных документов имена классов, которые обрабатывают каждый элемент.

Ответ 3

Каждое пространство имен XML анализируется с помощью NamespaceHandler. Класс обработчика для пространства имен безопасности SecurityNamespaceHandler, который указан в файле spring.handlers внутри META-INF из spring - security-config-XXX.jar.

Элемент http анализируется HttpSecurityBeanDefinitionParser, а его дочерний элемент выходит из строя org.springframework.security.config.http.LogoutBeanDefinitionParser (защищен от пакетов).

Также см. примечания в Кодирование пространства именHandler и советы в Что beans зарегистрированы spring пространство имен безопасности?, если вы планируете его настроить.