【问题标题】:How does Spring's context namespace work?Spring 的上下文命名空间是如何工作的?
【发布时间】:2012-07-13 22:31:31
【问题描述】:

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

<context:annotation-config/>

我从official documentation阅读:

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

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

不过,我的问题是,哪个 Spring 组件/类实现了这种“从 1-liner 到多个 bean 定义的转换”功能?

【问题讨论】:

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


【解决方案1】:

如果你想知道 annotation-config 标签在幕后做了什么,请查看AnnotationConfigBeanDefinitionParser

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

您需要一个架构定义,一个NameSpaceHandler 和一个BeanDefinitionParser

【讨论】:

  • 感谢 Gkamal 提供这些参考资料,将继续阅读这些资料。
【解决方案2】:

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

【讨论】:

  • 感谢 Willie 提供有关此主题的自定义示例。
【解决方案3】:

它有助于将 bean 定义中的属性值外部化到一个单独的文件中。

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

占位符遵循这种风格 ${property-name}

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 2015-09-10
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多