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.handlersMETA-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