尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

SpringBoot_02_自动配置原理

发布时间:2026/9/27 1:34:14

资讯中心
01
ARTICLE

SpringBoot_02_自动配置原理

SpringBoot_02_自动配置原理
【Spring Boot】自动配置原理EnableAutoConfiguration 与 Starter 机制关键词Java、Spring Boot、自动配置、EnableAutoConfiguration、Conditional、Starter、SPI一、什么是自动配置Spring Boot 自动配置是指根据你引入的依赖自动帮你配置好对应的 Bean不需要手动写 XML 或 Bean。一句话理解你在 pom.xml 引入了spring-boot-starter-webSpring Boot 就自动帮你配好 DispatcherServlet、视图解析器、JSON 转换器等开箱即用。二、自动配置的核心流程SpringBootApplication ↓ EnableAutoConfiguration ↓ Import(AutoConfigurationImportSelector.class) ↓ 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ↓ 加载所有自动配置类xxxAutoConfiguration ↓ 根据 Conditional 条件判断是否生效 ↓ 注册对应的 Bean 到 Spring 容器三、关键注解详解3.1 EnableAutoConfigurationTarget(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)Import(AutoConfigurationImportSelector.class)publicinterfaceEnableAutoConfiguration{}核心是通过Import导入AutoConfigurationImportSelector它负责加载所有自动配置类。3.2 AutoConfigurationImportSelector// 简化版逻辑publicclassAutoConfigurationImportSelectorimplementsImportSelector{OverridepublicString[]selectImports(AnnotationMetadatametadata){// 读取 META-INF/spring/...AutoConfiguration.imports 文件// 返回所有自动配置类的全限定类名returngetCandidateConfigurations(annotationMetadata);}}配置文件位置Spring Boot 3.xMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsSpring Boot 2.xMETA-INF/spring.factories3.3 Conditional 系列注解Conditional 是自动配置生效的关键——只有满足条件时配置类才会生效。注解条件ConditionalOnClassclasspath 中存在某个类时生效ConditionalOnMissingClassclasspath 中不存在某个类时生效ConditionalOnBean容器中存在某个 Bean 时生效ConditionalOnMissingBean容器中不存在某个 Bean 时生效ConditionalOnProperty配置属性满足某个值时生效ConditionalOnWebApplication当前是 Web 应用时生效四、源码解读Web 自动配置4.1 ServletWebServerFactoryAutoConfigurationAutoConfigurationConditionalOnWebApplication(typeType.SERVLET)ConditionalOnClass(DispatcherServlet.class)publicclassServletWebServerFactoryAutoConfiguration{BeanConditionalOnMissingBeanpublicServletWebServerFactorywebServerFactory(Value(${server.port:8080})intport){// 创建内嵌 TomcatTomcatServletWebServerFactoryfactorynewTomcatServletWebServerFactory();factory.setPort(port);returnfactory;}BeanConditionalOnMissingBeanpublicDispatcherServletdispatcherServlet(){returnnewDispatcherServlet();}}解读ConditionalOnWebApplication(type SERVLET)只有 Servlet 类型 Web 应用才生效ConditionalOnClass(DispatcherServlet.class)classpath 有 DispatcherServlet 才生效ConditionalOnMissingBean如果用户没有自定义才使用默认配置这就是约定优于配置的实现有 web 依赖 → 自动配 Tomcat DispatcherServlet你自定义了 → 用你的不用默认的4.2 DataSourceAutoConfiguration数据源自动配置AutoConfigurationConditionalOnClass(DataSource.class)EnableConfigurationProperties(DataSourceProperties.class)publicclassDataSourceAutoConfiguration{BeanConditionalOnMissingBeanConditionalOnProperty(spring.datasource.url)publicDataSourcedataSource(DataSourcePropertiesproperties){returnproperties.initializeDataSourceBuilder().build();}}解读ConditionalOnClass(DataSource.class)引入了数据库驱动才生效ConditionalOnProperty(spring.datasource.url)配置了 URL 才生效ConditionalOnMissingBean用户没自定义 DataSource 才创建默认的五、Starter 机制5.1 什么是 StarterStarter 是一组依赖集合引入一个 Starter 就等于引入了一组相关依赖且版本经过验证不会冲突。!-- 引入这个 Starter自动包含 --!-- spring-web, spring-webmvc, jackson, tomcat, ... --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency5.2 常用 StarterStarter功能spring-boot-starter-webWeb 开发MVC Tomcat Jacksonspring-boot-starter-data-jpaJPA 数据访问spring-boot-starter-data-redisRedis 操作spring-boot-starter-security安全认证spring-boot-starter-test测试JUnit Mockitospring-boot-starter-actuator监控和管理mybatis-spring-boot-starterMyBatis 整合5.3 Starter 的组成一个 Starter 通常包含pom.xml聚合依赖自动配置类xxxAutoConfiguration配置属性类xxxPropertiesAutoConfiguration.imports或spring.factories注册自动配置类六、自定义 Starter三步走① 配置属性类ConfigurationProperties(prefixmy.log)publicclassLogProperties{privatebooleanenabledtrue;privateStringprefix[LOG];// getter/setter}② 自动配置类AutoConfigurationConditionalOnWebApplicationEnableConfigurationProperties(LogProperties.class)publicclassLogAutoConfiguration{BeanConditionalOnMissingBeanpublicLogInterceptorlogInterceptor(LogPropertiesprops){returnnewLogInterceptor(props);}BeanpublicWebMvcConfigurerlogWebMvcConfigurer(LogInterceptorinterceptor){returnnewWebMvcConfigurer(){OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(interceptor).addPathPatterns(/**);}};}}③ 注册在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写入com.example.LogAutoConfiguration。其他项目引入该 Starter 依赖后配置my.log.enabledtrue即可自动生效。七、如何查看哪些自动配置生效了7.1 启动日志启动时设置debugtruedebug:true或命令行java -jar app.jar --debug控制台会输出CONDITIONS EVALUATION REPORTPositive matches生效的自动配置Negative matches未生效的自动配置及原因7.2 IDEA 查看安装 Spring Boot Assistant 插件可以在 yml 中直接看到配置对应的自动配置类。八、面试高频问题Q1Spring Boot 自动配置的原理答SpringBootApplication包含EnableAutoConfiguration它通过Import(AutoConfigurationImportSelector.class)加载AutoConfiguration.imports中的所有自动配置类。每个配置类上都有Conditional系列注解只有满足条件如 classpath 存在某个类、容器中存在某个 Bean、配置属性满足某个值时配置类才会生效并注册对应的 Bean。Q2ConditionalOnBean 和 ConditionalOnMissingBean 的区别答ConditionalOnBean表示容器中存在某个 Bean 时才生效ConditionalOnMissingBean表示容器中不存在某个 Bean 时才生效。后者常用于提供默认配置——如果用户没有自定义就使用框架提供的默认 Bean。Q3如何自定义 Starter答三步① 创建xxxProperties配置属性类用ConfigurationProperties绑定配置项② 创建xxxAutoConfiguration自动配置类用Conditional控制生效条件③ 在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中注册配置类的全限定名。九、总结知识点核心要点自动配置原理EnableAutoConfiguration→ 加载 imports →Conditional条件判断Conditional控制配置类是否生效的核心注解Starter一组依赖集合 自动配置开箱即用自定义 StarterProperties AutoConfiguration imports 文件下一篇预告《Spring Boot Web 开发》详解 RESTful API、全局异常处理、拦截器在 Spring Boot 中的实现。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。