下面分两部分系统讲解:
传统 Spring 开发时,你要写一堆 XML 或配置类,非常麻烦。Spring Boot 引入了“自动配置”机制——你只需要引入依赖并加几个注解,框架就帮你完成配置初始化。
你几乎不需要管:
这一切都由自动配置帮你完成了。
@SpringBootApplication
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这个注解其实是个组合注解,相当于:
@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableAutoConfiguration
:是自动配置的关键入口@ComponentScan
:扫描当前包及子包的 Spring Bean@Configuration
:表示这是一个配置类@EnableAutoConfiguration
内部用到了 @Import
:@Import(AutoConfigurationImportSelector.class)
也就是说,它会把一堆自动配置类注册到 Spring 容器里。
AutoConfigurationImportSelector
会读取下面这个配置文件:META-INF/spring.factories
里面有很多形如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...
这些类都带有 @Configuration
注解,会被 Spring 自动加载成配置类。
重点理解:Spring Boot 会扫描所有依赖中的 spring.factories
文件,自动注册这些配置类。
@ConditionalOnXxx
是关键Spring Boot 不会傻傻把所有配置都启用,而是根据当前环境条件决定是否装配
比如:
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
// 配置数据源
}
✅ 所以你可以覆盖它的默认配置!
如果你写了自己的配置,Spring Boot 默认配置会被你的配置覆盖,非常灵活。
SpringApplication.run(...)
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
这个 run()
方法做了以下几件事:
我们分步骤拆解下:
SpringApplication
实例SpringApplication app = new SpringApplication(MyApp.class);
会完成:
ApplicationContextInitializer
)ApplicationListener
)run()
方法app.run(args);
这一步做了很多重要事:
包括 application.yml
、系统环境变量、命令行参数等。
监听器会在项目启动前、加载环境、创建容器、容器刷新、应用启动后等关键节点被触发。
ApplicationContext
Spring Boot 根据项目类型选择:
AnnotationConfigServletWebServerApplicationContext
AnnotationConfigApplicationContext
把所有 @Component
、@Service
、@Repository
、@Controller
注册进 Spring 容器。
并执行 @Configuration
里的 @Bean
方法。
Spring Boot 会自动创建并启动内置 Tomcat、Jetty 或 Undertow,并注册 DispatcherServlet。
CommandLineRunner
和 ApplicationRunner
项目启动后,如果你定义了这两个接口,会被自动回调:
@Component
public class MyRunner implements CommandLineRunner {
public void run(String... args) {
System.out.println("启动完成后执行");
}
}
问题 | 回答关键点 |
---|---|
Spring Boot 是如何实现自动装配的? | @EnableAutoConfiguration + spring.factories + @ConditionalOn... |
自动配置类是怎么被加载的? | 通过 SpringFactoriesLoader 读取 META-INF/spring.factories |
如果我不想用默认配置怎么办? | 提供同类型 Bean,默认配置类就不会生效 |
Spring Boot 启动流程有哪些阶段? | 创建实例 → 加载环境 → 创建容器 → 加载配置 → 启动 Tomcat |
@EnableAutoConfiguration
+ spring.factories
配合条件注解。SpringApplication.run()
,它完成了环境准备、Bean 加载、容器创建、Web 容器启动等步骤。