Spring的上下文命名空间如何工作?

时间:2012-07-14 05:05:05

标签: java spring xml-namespaces applicationcontext post-processing

例如,如果我在application-context.xml中声明:

<context:annotation-config/>

我从official documentation开始阅读:

  

隐式注册的后处理器包括   AutowiredAnnotationBeanPostProcessor,   CommonAnnotationBeanPostProcessor会,   PersistenceAnnotationBeanPostProcessor,以及前面提到的   RequiredAnnotationBeanPostProcessor。

但是我想知道Spring是如何工作的,我认为这个1-liner被转换为文档中提到的后处理器的几个bean定义。

但是,我的问题是,哪个Spring组件/类实现了从<1-liner到多个bean定义'功能的'转换?

3 个答案:

答案 0 :(得分:5)

如果您想了解幕后的annotation-config标签,请查看AnnotationConfigBeanDefinitionParser

如果您想了解更多关于用于定义此类标记的一般机制,请查看 弹簧参考文档的this部分。

您需要架构定义,NameSpaceHandlerBeanDefinitionParser

答案 1 :(得分:1)

gkamal的好参考。

当应用程序启动时,Spring会注册所有这些自定义命名空间,并且特定于命名空间的处理程序会为自定义命名空间中的每个元素注册解析器。例如,我在自己的一个项目中做了一个自定义命名空间:

https://github.com/williewheeler/kite/blob/master/src/main/java/org/zkybase/kite/config/xml/KiteNamespaceHandler.java

请注意,所有NamespaceHandler都会为自定义命名空间注册一堆解析器。

然后,当Spring实际解析配置文件时,它会根据您在问题中的建议将自定义命名空间元素转换为bean定义。有时它只是一个非常简单的bean定义:

https://github.com/williewheeler/kite/blob/master/src/main/java/org/zkybase/kite/config/xml/CircuitBreakerParser.java

有时它是一大堆bean定义:

https://github.com/williewheeler/kite/blob/master/src/main/java/org/zkybase/kite/config/xml/AnnotationConfigParser.java

答案 2 :(得分:0)

它有助于在单独的文件中外化bean定义中的属性值。

定义的属性在启动时解决。

占位符遵循此样式$ {property-name}