面试知识库

SpringBoot启动 → 自动配置 → Starter 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 启动主线SpringApplication.run()推断类型→准备环境→创建并refresh容器→启动内嵌容器,期间触发各类Listener事件
  2. 三合一注解@SpringBootApplication = 配置类 + 自动配置 + 包扫描
  3. 自动配置链路@EnableAutoConfiguration@Import选择器→读AutoConfiguration.imports(旧版spring.factories)→拿到一堆配置类
  4. 按需生效靠条件注解@ConditionalOnClass判断依赖在不在、@ConditionalOnMissingBean实现”用户优先”,这就是”约定优于配置”的底层
  5. Starter职责分离:starter是空的依赖聚合包,autoconfigure包才放配置类,二者分开便于复用
  6. 代码示例
    // 一个典型的自动配置类
    @AutoConfiguration
    @ConditionalOnClass(RedisTemplate.class)              // classpath有Redis才配
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfiguration {
        @Bean
        @ConditionalOnMissingBean                          // 用户没自定义才用默认
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory f) {
            RedisTemplate<Object, Object> t = new RedisTemplate<>();
            t.setConnectionFactory(f);
            return t;
        }
    }
    java

面试回答串联#

30秒速答#

“SpringApplication.run()推断应用类型、准备环境、创建容器refresh、启动内嵌Tomcat。@SpringBootApplication是配置类+自动配置+包扫描三合一。自动配置靠@EnableAutoConfiguration导入选择器,读AutoConfiguration.imports清单(老版本是spring.factories),再用@ConditionalOnClass、@ConditionalOnMissingBean这些条件注解按需装配,实现约定优于配置。Starter只是依赖聚合,真正配置在autoconfigure包里。“

2分钟展开答#

“SpringBoot启动入口是SpringApplication.run(),它先推断应用类型(普通/Web/响应式),加载ApplicationContextInitializer和Listener,准备Environment读配置,创建对应的ApplicationContext,调refresh()完成Bean注册和初始化,最后启动内嵌Tomcat,整个过程通过事件机制把各扩展点串起来。核心注解@SpringBootApplication是三个注解的组合:@SpringBootConfiguration标识配置类、@ComponentScan做包扫描、@EnableAutoConfiguration开启自动配置。自动配置是SpringBoot的灵魂:@EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector,它去读META-INF下的自动配置清单——SpringBoot2.x读spring.factories里EnableAutoConfiguration这个key,2.7和3.x改成了AutoConfiguration.imports文件,本质都是SPI机制。拿到几十上百个自动配置类后,并不是全都生效,而是靠条件注解按需装配:@ConditionalOnClass判断某个类在不在classpath、@ConditionalOnProperty判断配置开关、最关键的@ConditionalOnMissingBean——用户一旦自己定义了同类型的Bean,默认配置就不生效,这就是’约定优于配置’同时又允许覆盖的底层原理。Starter本身是个几乎空的依赖聚合包,真正的配置类在对应的autoconfigure包里,两者分离是为了复用。自己写starter就是建autoconfigure模块写@AutoConfiguration配置类配合条件注解和@ConfigurationProperties,再注册到imports文件。另外@Configuration的proxyBeanMethods默认true会用CGLIB代理保证@Bean方法互调拿到同一单例,设false是Lite模式启动更快。排查启动可以用—debug看Conditions评估报告。“

相关追问链#