1、@SpringBootApplication
SpringBoot实现自动装配的基础是@SpringBootApplication,它是SpringBoot项目启动类上的一个组合注解。它的主要作用就是标记说明这个类是SpringBoot的主配置类,Springboot应该运行这个类里面的main()方法来启动程序。
@SpringBootApplication注解主要由三个子注解组成:
-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
1.1@SpringBootConfiguration
@SpringBootConfiguration包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组件。
1.2@EnableAutoConfiguration
@EnableAutoConfiguration是开启自动配置的功能,里面包含了两个注解
-
@AutoConfigurationPackage
-
@Import(AutoConfigurationImportSelector.class)
1.2.1@AutoConfigurationPackage
@AutoConfigurationPackage作用是指定springboot扫描包,默认就是扫描启动类同包下的类以及子包里面的所有组件扫描并加载到spring的容器中,这也就是为什么我们在利用springboot进行开发的时候,无论是Controller还是Service的路径都是与主配置类同级或者次级的原因。
Registrar是AutoConfigurationPackages当中的一个内部类,这个内部类实现了ImportBeanDefinitionRegistrar接口, 它会执行registerBeanDefinitions方法。(通过@Import注入对象一共有四种方式,通过ImportBeanDefinitionRegistrar接口的实现类注入是其中一种)
重点看registerBeanDefinitions方法,它的作用是将注解标注的元信息传入,并获取到相应的包名。
-
AnnotationMetadata参数值是注解标注的元信息。
-
BeanDefinitionRegistry参数值是DefaultListableBeanFactory实现类。
DefaultListableBeanFactory是Bean工厂的一个默认实现,提供了原始的BeanFactory的功能。DefaultListableBeanFactory类的beanDefinitionMap属性就是IOC容器,通过debug可以看到主启动类也在IOC容器当中。
-
register方法
可以看到register方法会注册一个BeanDefinition,这个BeanDefinition中保存了@AutoConfigurationPackage注解标注类所在到包路径。
1.2.2@Import({AutoConfigurationImportSelector.class})
@import注解导入AutoConfigurationImportSelector这个配置类,它实现了DeferredImportSelector接口,Spring容器在启动时,会在解析完其他所有程序员定义的配置类之后,来调用AutoConfigurationImportSelector中的selectImports方法(Spring Framework中的知识),然后把该方法返回的类名对应的类作为配置类进行解析。
selectImports方法解析
selectImports核心功能是获取spring.factories中EnableAutoConfiguration所对应的Configuration类列表,由@EnableAutoConfiguration的exclude/excludeName参数筛选一遍,再由AutoConfigurationImportFilter类所有实例筛选一遍,得到最终的用于Import的configuration和exclusion。
1.3@ComponentScan
@ComponentScan 用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等。与ComponentScan注解相对应的XML配置就是context:component-scan, 根据指定的配置自动扫描package,将符合条件的组件加入到IOC容器中。