4

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

<context:annotation-config/>

我从官方文档中读到:

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

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

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

4

3 回答 3

5

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

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

您需要一个模式定义、一个NameSpaceHandler和一个BeanDefinitionParser

于 2012-07-14T05:56:41.967 回答
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

于 2012-07-14T06:53:23.330 回答
0

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

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

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

于 2017-03-24T05:32:45.537 回答