跳到主要内容
版本:1.0

启动与自动装配注解

Spring Boot 的「零配置」体验来自自动装配机制。理解这几个注解,就理解了 Spring Boot 的启动原理。

@SpringBootApplication​

标注在启动类上,是一个组合注解:

@SpringBootConfiguration // 本质就是 @Configuration,标识这是一个配置类
@EnableAutoConfiguration // 开启自动装配
@ComponentScan // 扫描当前包及子包下的组件
public @interface SpringBootApplication { }

@ComponentScan​

扫描并注册带有 @Component、@Service、@Controller 等注解的类到 IoC 容器。默认扫描启动类所在包及子包,可用 scanBasePackages 扩展。

@EnableAutoConfiguration​

自动装配的核心。它会读取所有依赖中 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件里声明的自动配置类,按需装配 Bean。

「按需」由条件注解控制,例如:

条件注解含义
@ConditionalOnClassclasspath 中存在指定类时生效
@ConditionalOnMissingBean容器中不存在该 Bean 时才装配
@ConditionalOnProperty配置项满足条件时生效
@ConditionalOnWebApplication是 Web 应用时生效

例如 DataSourceAutoConfiguration 上有 @ConditionalOnClass(DataSource.class)——只有引入了数据库相关依赖,才会自动配置数据源。

查看自动装配报告​

想知道哪些自动配置生效了,启动时加参数:

java -jar demo.jar --debug

或配置:

debug: true

控制台会输出 Positive matches(生效的配置)与 Negative matches(未生效的配置及原因)。

排除某个自动配置​

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class DemoApplication { }

常用于还没接数据库时的快速启动。

@Configuration 与 @Bean​

自动装配之外的「手动装配」方式:

@Configuration
public class MyConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

@Configuration 标识配置类,@Bean 把方法返回值注册进容器,Bean 名默认为方法名。