Рассмотрим случай, когда нужно сконфигурировать часть компонентов для приложения Spring MVC без пользовательских пространств имен — это обычно выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< bean name = "handlerAdapter" class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" > < property name = "webBindingInitializer" > < bean class = "org.springframework.web.bind.support.ConfigurableWebBindingInitializer" > < property name = "conversionService" ref = "conversionService" ></ property > < property name = "validator" > < bean class = "org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> </ property > </ bean > </ property > < property name = "messageConverters" > < list > < bean class = "org.springframework.http.converter.ByteArrayHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.StringHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.ResourceHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.xml.SourceHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" ></ bean > < bean class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" ></ bean > </ list > </ property > </ bean > < bean name = "handlerMapping" class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" > < property name = "useSuffixPatternMatch" value = "false" ></ property > </ bean > |
Здесь он настраивает два bean-компонента — handlerAdapter для обработки потока контроллера MVC и handlerMapping для сохранения соответствия между URI запроса и методами Controller для обработки запросов.
Та же конфигурация становится очень лаконичной с настраиваемым пространством имен, «http://www.springframework.org/schema/mvc» обычно с префиксом namspace «mvc»:
1
2
|
< mvc:annotation-driven conversion-service = "conversionService" > </ mvc:annotation-driven > |
По сути, это является преимуществом использования пользовательского пространства имен — очень краткого способа описания определений bean-компонента Spring.
Итак, как работает пользовательское пространство имен:
Этот раздел в справочном документе Spring описывает его гораздо лучше, чем я — http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/extensible-xml.html#extensible-xml -схема Подводя итог, пользовательское пространство имен состоит из 4 частей:
- схема, которая описывает структуру пользовательского пространства имен — имена тегов, атрибуты, дочерние теги и т. д.
- NamespaceHandler — который создает определение компонента для элементов xml. Однако обычно лучшим механизмом, предлагаемым в документе Spring, является расширение NameSpaceHandlerSupport и регистрация серии BeanDefinitionParser (s) для различных элементов xml, поддерживаемых пользовательским пространством имен (скажем, управляемым аннотациями, элементами-перехватчиками пространства имен mvc).
- BeanDefinitionParser — создайте определение bean-компонента для конкретного элемента — здесь строка, подобная <mvc: annotation-driven />, будет расширена до более широких определений bean-компонентов с фактическими именами классов bean-компонентов.
- Регистрация схемы, NamespaceHandler — это для Spring, чтобы найти схему для пользовательских пространств имен и найти NamespaceHandler, который будет обрабатывать пользовательское пространство имен. Регистрация схемы выполняется с помощью файла META-INF / spring.schemas , это отличный способ для Spring найти схему в classpath, а не загружать схему через Интернет. NamespaceHandler дополнительно указывается с использованием файла META-INF / spring.handlers и содержит имя NamespaceHandler, которое будет обрабатывать пользовательское пространство имен, например, для. из весенней документации —
1
|
http\://www.mycompany.com/schema/myns=org.springframework.samples.xml.MyNamespaceHandler |
Связывая это вместе
Эта информация о том, как внутреннее пространство Пользовательского пространства работает, может быть эффективно использована для понимания поведения некоторых пользовательских тегов пространства имен. Рассмотрим тег для загрузки файла свойств:
1
|
< context:property-placeholder location = "classpath*:META-INF/spring/database.properties" /> |
Итак, чтобы выяснить, как элемент property-placeholder работает внутри, сначала найдите файл spring.handlers. Поскольку свойство-заполнитель находится в пространстве имен контекста, файл spring.handlers будет присутствовать в файле spring-context.jar.
и файл указывает, что NamespaceHandler является org.springframework.context.config.ContextNamespaceHandler
1
|
< context:property-placeholder location = "classpath*:META-INF/spring/database.properties" local-override = "true" properties-ref = "localProperties" /> |
с потерей лаконичности в процессе —
1
2
3
4
5
6
7
|
< bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > < property name = "location" value = "classpath*:META-INF/spring/database.properties" ></ property > < property name = "localOverride" value = "true" ></ property > < property name = "properties" > < ref bean = "localProperties" /> </ property > </ bean > |
Это, однако, обеспечивает хороший способ понять некоторые нюансы в том, как Spring обрабатывает вещи, лежащие в основе пользовательского пространства имен.
Ссылка: Spring Custom Namespaces от нашего партнера JCG Биджу Кунджуммен в блоге all and sundry.