@ComponentScan
指定组件扫描的根路径,如果未指定具体路径,则默认为配置类所在包路径,主要是扫描 Spring 家族的各种 Bean,如 @Controller、@Service、@Component、@Repository 以及由此衍生出来的一些其他的 Bean
@AutoConfigurationPackage
指定自动配置包的基本路径,它通过@Import机制将AutoConfigurationPackages.Registrar.class导入到Spring容器中,它负责在Spring容器中注册自动配置所需的包信息。说白了,它就是注册了一个bean,保存了自动配置包相关信息,后续其他的自动配置类想要扫描所需要的包时可以去容器中获取该信息。比如Mybatis想要扫描@Mapper注解,就要先去获取这个基本路径
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}