SpringBoot面试宝典
SpringBoot
1、核心启动流程
入口点:@SpringBootApplication
@SpringBootApplication
是 Spring Boot 项目的核心入口注解,是三个注解的组合
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // 1. 标记为配置类
@EnableAutoConfiguration // 2. 启用自动配置
@ComponentScan( // 3. 组件扫描excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})}
)
public @interface SpringBootApplication {// ... 属性配置
}
@SpringBootConfiguration
- 作用:标识当前类为 Spring Boot 的配置类
- 等价于:
@Configuration
(Spring 标准配置注解) - 特点:
- 类中可以使用
@Bean
定义 Bean - 配置类本身也会被注册为 Bean
- 类中可以使用
@EnableAutoConfiguration
- 核心机制:启用 Spring Boot 的自动配置魔法
- 工作原理:
- 加载
META-INF/spring.factories
文件中的配置 - 过滤符合条件的自动配置类(通过
@Conditional
系列注解) - 根据类路径和已有 Bean 动态配置应用
- 加载
@ComponentScan
-
作用:自动扫描并注册组件
-
默认行为:扫描当前包及其子包中的组件
@Component
@Service
@Repository
@Controller
-
自定义扫描路径:
@SpringBootApplication(scanBasePackages = "com.example.myapp") // 或 @SpringBootApplication(scanBasePackageClasses = {MyService.class, MyController.class})
SpringApplication.run () 核心步骤
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {return run(new Class<?>[] { primarySource }, args);
}public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {// 创建 SpringApplication 实例并执行 run 方法return new SpringApplication(primarySources).run(args);
}public ConfigurableApplicationContext run(String... args) {// 1. 创建计时器和监听器StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();// 2. 配置无头模式(Headless Mode)configureHeadlessProperty();// 3. 获取并启动应用监听器SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {// 4. 解析命令行参数ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 5. 准备环境(配置属性源、激活配置文件)ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 6. 打印 BannerBanner printedBanner = printBanner(environment);// 7. 创建应用上下文(Servlet 或 Reactive)context = createApplicationContext();// 8. 加载异常报告器exceptionReporters = getSpringBootExceptionReporters(context);// 9. 准备上下文(注册单例 Bean、应用后置处理器)prepareContext(context, environment, listeners, applicationArguments, printedBanner