SpringBoot自动化配置原理
SpringBoot自动化配置从注解@SpringBootApplication开始,它封装的注解如下图所示:
需要注意的有三个注解:
1.第一个注解是 @SpringBootConfiguration,底层是一个@Configuration注解,表示当前类是一个配置类,可以使得引导类中的SpringBoot或Spring配置能生效
2.第二个注解是@ComponentScan,是一个组件扫描,spring会扫描引导类所在的包及子包下的组件
在@EnableAutoConfiguration中,封装了注解@AutoConfigurationPackage
其导入的Registrar.class中,如下注册器定义
其getPackageNames()得到的就是@SpringBootApplication注解即引导类所在的包,故此包名下所有的包及子包下的组件都会被扫描
3.在注解@EnableAutoConfiguration中,通过注解@Import(AutoConfigurationImportSelector.class)导入了AutoConfigurationImportSelector配置类,在该配置类中:
BeanFactoryAware接口中,BeanFactory即为所有SpringIOC容器的顶层接口,而selectImports方法来选择自动导入的内容:
通过getAutoConfigurationEntry(annotationMetadata)得到AutoConfigurationEntry对象,其annotationMetadata就是原注解@SpringBootApplication中的内容,在该方法中:
configurations是添加进自动配置的内容,而exclusions是排除出自动配置的内容,configurations由方法getCandidateConfigurations产生:
getSpringFactoriesLoaderFactoryClass()给予的就是EnableAutoConfiguration.class,作为第一个参数出现在loadFactoryNames方法中:
该方法的参数factoryTypeName就是EnableAutoConfiguration.class,它的名字就是EnableAutoConfiguration,方法loadSpringFactories以它为参数:
读出了FACTORIES_RESOURCE_LOCATION也就是"META-INF/spring.factories"中以EnableAutoConfiguration为键的值(比如 自动配置aliyun文件上传服务时,
我们使用下述配置
就可以加载OssAutoConfiguration)
后面的断言提示META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports也会被扫描,新版本扫描该文件
将这些值封装成一个集合存在configurations中,再封装为AutoConfigurationEntry对象,来添加自动配置的内容,被配置的类以@Conditional注解声明自动配置的条件,以WebMvcAutoConfiguration类为例:
@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class..说明在前端控制器加载后配置,@ConditionalOnWebApplication(type = Type.SERVLET)说明要先有Servlet环境,@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })说明要有Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class字节码文件,@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)是可以让使用者自定义的WebMvcConfigurationSupport.class文件来覆盖默认配置,因此当手动配置时,该配置不加载,总之,满足上述条件的内容加载到了内存中,封装成一字符串数组,再通过SpringApplication.run方法将上面注解实现加载到内存中的字符串数组根据条件反射创建对象,把对象当作bean注入到Spring容器中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现