- 启动类与 @SpringBootApplication 注解
在 Spring Boot 应用中,通常会有一个带有 main 方法的启动类,并且该类会被 @SpringBootApplication 注解标注。
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication 是一个组合注解,它包含了 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 三个重要注解:
@SpringBootConfiguration:本质上是 @Configuration 注解,用于标识该类是一个配置类。
@ComponentScan:启用组件扫描功能,Spring Boot 会自动扫描该启动类所在包及其子包下的所有带有 @Component、@Service、@Repository 等注解的类,并将它们注册为 Spring Bean。
@EnableAutoConfiguration:这是实现自动加载的关键注解,它会触发 Spring Boot 的自动配置机制。
-
@EnableAutoConfiguration 注解与自动配置导入器
@EnableAutoConfiguration 注解借助 @Import 注解引入了 AutoConfigurationImportSelector 类。
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// ...
}
AutoConfigurationImportSelector 类负责加载自动配置类。它会从 META - INF/spring.factories 文件中读取所有的自动配置类信息。 -
META - INF/spring.factories 文件
3.X版本已经替换为AutoConfiguration.imports 文件
Spring Boot Starter 依赖在其 META - INF/spring.factories 文件中定义了自动配置类。例如,org.springframework.boot.autoconfigure模块的 spring.factories 文件中包含了大量的自动配置类:
properties
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
更多自动配置类...
AutoConfigurationImportSelector 会读取这个文件,将所有以 org.springframework.boot.autoconfigure.EnableAutoConfiguration 为键的自动配置类加载到应用上下文中。
- 条件注解过滤
虽然加载了大量的自动配置类,但并不是所有的自动配置类都会生效。Spring Boot 使用了一系列的条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等)来根据不同的条件进行过滤。
@ConditionalOnClass:当类路径下存在指定的类时,对应的自动配置类才会生效。
@ConditionalOnMissingBean:当容器中不存在指定类型的 Bean 时,对应的自动配置类才会生效。
@ConditionalOnProperty:当配置文件中存在指定的属性且值符合要求时,对应的自动配置类才会生效。
例如:
java
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
// 数据源自动配置逻辑
}
只有当类路径下存在 DataSource 类时,DataSourceAutoConfiguration 这个自动配置类才会生效。
总结:
Spring Boot Starter 的自动加载原理是通过 @SpringBootApplication 注解触发,@EnableAutoConfiguration 注解借助 AutoConfigurationImportSelector 从 META - INF/spring.factories 文件中加载自动配置类,然后使用条件注解对这些自动配置类进行过滤,最终将符合条件的自动配置类应用到 Spring 应用上下文中,实现自动配置的功能。
如果使用自动配置时,不知道配置文件如何写时,可以先找到AutoConfiguration类,然后找到里边的Properties类,就知道配置参数如何定义了









网友评论