SpringBoot之所以能大幅减少程序员的配置工作,主要是因为有自动配置的功能。这篇文章我们来自己实现一个简单的能自动配置的工程。
自定义自动配置
首先定义一个User
类:
1 | public class User { |
然后定义一个加载User属性的类UserProperties
:
1 | "user") (prefix = |
UserProperties
能从application.yml文件中读取以user开头的配置,配置如下:
1 | user: |
要想达到自动配置的效果,需要定义一个配置类,然后在META-INF/spring.factories
文件中加入自动配置的类。
配置类如下定义:
1 |
|
在META-INF/spring.factories
文件中加入自动配置的类:
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=love.wangqi.UserAutoConfiguration |
最后我们新建一个类来测试一下自动配置的效果:
1 | public class MainApplication { |
执行程序,输出{name:wangqi, age:21}
。随着我们改变application.yml配置,会输出相应修改的结果。
自动配置代码探究
上面我们讨论了如何自定义自动配置的类,下面我们来探究一下这个自动配置是如何发生的。
我们直接看自动配置的发生点,调用流程如下:
- SpringApplication.run
- SpringApplication.refreshContext
- AbstractApplicationContext.refresh
- AbstractApplicationContext.invokeBeanFactoryPostProcessors
- PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
- PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors
- ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry
- ConfigurationClassPostProcessor.processConfigBeanDefinitions
- ConfigurationClassParser.parse
- ConfigurationClassParser.processDeferredImportSelectors
在ConfigurationClassParser.processDeferredImportSelectors
有以下几个步骤:
- 调用
AutoConfigurationImportSelector.selectImports
获取所有META-INF/spring.factories
文件中定义的EnableAutoConfiguration类。 然后调用
ConfigurationClassParser.processImports
处理前面获取的EnableAutoConfiguration类调用
ConfigurationClassParser.processConfigurationClass
方法将UserAutoConfiguration
当成Config类来解析。于是它注册User类的BeanDefinition,在随后的实例化过程实例化User。