Spring 自定义配置加载
Spring 工程中一般以 xml (spring-framework) 和 yml (spring-boot) 做为配置文件,配置除了框架提供的也支持增加其他配置,它们是以同样的形式注册到 Spring 中的。
1. xml 配置
这是早期 Spring 提供的配置方式,需要与 xsd
文件配合使用。
文件的解析是需要通过实现 org.springframework.beans.factory.xml.NamespaceHandlerSupport
提供解析器,在 init
方法中调用 registerBeanDefinitionParser
将 xsd元素名称 与 元素解析器 进行绑定。
对于 xsd元素 所绑定的解析器是 org.springframework.beans.factory.xml.BeanDefinitionParser
,实现元素到 BeanDefinition
的转换,并交由 Spring 容器进行实例注册。
最后需要将完成的解析器与 xsd文件 通过 META-INF/spring.handlers
和 META-INF/spring.schemas
进行映射,在 spring.schemas 中以 命名空间地址 = xsd文件路径
的形式配置,在 spring.handlers 中以 命名空间地址 = 解析器类全路径
的形式配置。
由于 yml 配置的便捷性导致了 xml 配置方式在开发中逐渐被替换。
2. yml 配置
跟随 spring-boot 一起出现的配置模式,相较于 xml 显得尤其简便。同时也舍弃了 xml 的解析器,使用等同于 @Conditional
的注册 Configuration 在 Spring 的生命周期进行容器管理。
Enable 注解
这种方式主要是提供注解使用,并在注解内配置 @Import
显式的注册 Configuration。
例如 @EnableAspectJAutoProxy
, @EnableScheduling
, @EnableMBeanExport
。
自动装配
通过创建 META-INF/spring.factories
文件,配置需要装配的 Configuration 即可。其原理是使用了 @EnableAutoConfiguration
注解,通过注册的 AutoConfigurationImportSelector
扫描所有依赖 jar 包内的 META-INF/spring.factories
,将配置的 Configuration 进行注册。与显式注解形式配置有所不同,这种方式配置的 Configuration 还可以使用 @AutoConfigureAfter
和 @AutoConfigureBefore
控制执行顺序。
这种是最为常见的使用方式,一般还需构建
spring-boot-starter
提供使用,具体使用见 官方文档
动态注册配置
结合了 Enable 注解
和 自动装配
的方式,能够更加灵活的配置 Configuration。实现方式为提供 Enable注解,并且在注解内配置 @Import ImportSelector
,通过 ImportSelector 返回 Configuration 列表提供给 Spring 注册,可以根据条件控制返回的 Configuration,又或是提供类似 自动装配 的功能。
例如 @EnableAutoConfiguration
, @EnableAsync
, @EnableCaching
。