@ComponentScan注解触发组件扫描
@SpringBootApplication 是一个组合注解,它包含了 @ComponentScan 注解,该注解会触发 Spring Boot 对指定包及其子包下的组件进行扫描,并将带有特定注解(如 @Component、@Configuration @Service、@Repository、@Controller 等)的类注册为 Bean。
ComponentScanAnnotationParser 类负责解析 @ComponentScan 注解的属性,确定扫描的基础包、过滤规则等。它会根据注解中的 basePackages 或 basePackageClasses 属性来确定扫描的范围
ClassPathBeanDefinitionScanner 类根据 ComponentScanAnnotationParser 解析的结果,扫描类路径下的类,查找带有 @Component 及其派生注解的类,并将其注册为 Bean 定义。自动配置类注册 @AutoConfiguration
例如,DataSourceAutoConfiguration 类会根据类路径下是否存在相关的数据库驱动,自动配置数据源
自动配置机制核心由 EnableAutoConfiguration 注解触发,它通常包含在 @SpringBootApplication 注解中
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 其他属性和方法
}
@Import 会引入 AutoConfigurationImportSelector 类,该类负责加载自动配置类。
selectImports 方法会从 META - INF/spring.factories 文件中读取所有自动配置类,并根据条件进行筛选
@Import 注解导入 Bean 定义
@Import 注解最常见的使用场景是在带有 @Configuration @AutoConfiguration注解的配置类上,通过它可以将多个配置类组合在一起,方便管理和维护。从技术上来说,@Import 注解可以放在任何 Spring 组件类上
解析主要由 ConfigurationClassParser 类完成。在 Spring 容器启动过程中,ConfigurationClassPostProcessor 会调用 ConfigurationClassParser 来解析配置类(processImports),处理 @Import 注解@Bean 注解手动注册 Bean
在配置类中使用 @Bean 注解可以手动注册 Bean。
@Bean 注解方法的解析同样由 ConfigurationClassParser 类retrieveBeanMethodMetadata处理。在解析配置类时,会识别 @Bean 注解的方法,并将其封装为 BeanMethod 对象