Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理相关的知识,希望对你有一定的参考价值。

参考技术A 1 概述
2 实例
3 配置注入实现原理

使用过Spring Boot的都会知道,我们可以在application.properties文件中进行一系列的配置,该配置会被自动注入到我们需要使用的bean中,下面我们就介绍配置注入的实现原理。

首先,要知道在application.properties中的配置是通过 BeanPostProcessor 进行注入的,具体完成该功能的 BeanPostProcessor 实现类是 ConfigurationPropertiesBindingPostProcessor 。

本文接下来会介绍 ConfigurationPropertiesBindingPostProcessor 是在何时被加入到beanfactory中的,以及 @EnableConfigurationProperties 、 @ConfigurationProperties 注解的实现原理。

Spring Boot自动配置中充斥着大量使用通过application.properties进行扩展配置的实现,比如我们熟悉的 MybatisAutoConfiguration :

下面我们在看下 MybatisProperties 类的定义:

通过如上的注解,MyBatis就可以获得我们在application.properties中的配置了,比如如下配置:

要了解配置注入的实现原理,首先要找到上文介绍到的 ConfigurationPropertiesBindingPostProcessor 是何时被注册到beanfactory中的,通过阅读源码发现,在spring.factories文件中有如下一行:

可见,是通过 @EnableAutoConfiguration 注解引入了相关的配置, @EnableAutoConfiguration 通过 @Import 注解自动配置的原理这里不再介绍。我们看下 ConfigurationPropertiesAutoConfiguration 类的实现:

首先 ConfigurationPropertiesAutoConfiguration 被 @Configuration 注解,因此会在beanfactory加载时被作为配置类处理,具体在 ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry 调用 ConfigurationClassParser.parse 进行处理。

我们再看 @EnableConfigurationProperties 定义:

@EnableConfigurationProperties 通过 @Import(EnableConfigurationPropertiesImportSelector.class) 向容器中注入了相关的处理类, @Import 也是在 ConfigurationClassParser.parse 进行处理的。

EnableConfigurationPropertiesImportSelector 类定义如下:

好了,到这里,我们已经知道注解@ EnableConfigurationProperties.value 中指定的配置类是如何被注入到beanfactory中的了,那么注解 EnableConfigurationProperties.value 中指定的配置类中的属性是如何从application.properties被注入的呢?比如上面的

对应配置如下:

这就是我们前面提到的 BeanPostProcessor 接口实现类 ConfigurationPropertiesBindingPostProcessor 类处理的,而 ConfigurationPropertiesBindingPostProcessor 则是通过上面 EnableConfigurationPropertiesImportSelector 中使用类 ConfigurationPropertiesBindingPostProcessorRegistrar 进行注册的:

ConfigurationPropertiesBindingPostProcessor 是接口 BeanPostProcessor 的实现,会被 ApplicationContext 检测出来,在实例化每个bean时会被调用进行扩展处理。

以上是关于Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot实战源码解析Spring Boot自动配置原理

[Spring Boot] 1. Spring Boot启动过程源码分析

[Spring Boot] 1. Spring Boot启动过程源码分析

Spring Boot实战源码解析Spring Boot自动配置原理

Spring Boot实战源码解析Spring Boot自动配置原理

SpringBoot 源码解析 ----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)