SpringBoot自动装配原理:
SpringBoot提供了大量的自动配置类XxxAutoConfiguration,这些配置类都默认配置了大量的信息,包括redis、MongoDB、RabbitMQ、Aop等,这些配置类都使用@EnableConfigurationProperties指定了生效的属性配置类XxxPropertes,XxxProperties指定了自动配置类XxxAutoConfiguration的默认配置,这些自动配置类XxxAutoConfiguration的全限定类名放在spring-boot-configurat包下的META-INF/sring.factories下,springboot的启动类就可以在启动的时候加载该文件中的所有配置类,根据条件去判断应该配置哪些自动配置类,如:是否存在指定类、容器是否存在指定bean等条件判断该配置类是否生效,从而完成自动装配。
自动自动配置类上都有类似如下注解:判断在什么条件下,自动配置类生效。
自动配置实现过程:
采用组合注解修饰启动类实现:
@SpringBootApplication:该注解修饰SpringBoot的启动类,打开可以看到,它除了包含四个元注解,还组合了三个主要的注解:
1、@SpringBootConfiguration:打开注解发现,它组合的主要注解就是@Configuration,主要作用就是指定了该类为一个配置类。
2、@ComponenScan:这个注解自动扫描并加载复合条件的Bean到容器中,默认会扫描启动类所在的包以及子包中的类。
3、@EnableAutoConfiguration:该注解是SpringBoot自动装配实现的主要注解,它也是一个组合注解,打开注解:
可以看到它的主要实现分为两个:
@AutoConfigurationPackage:这个注解组合了@Import(AutoConfigurationPackages.Registrar.class),也就是给当前配置类导入了自动配置包下的Registrar.class配置类,该配置类调用registerBeanDefinitions方法,实际调用的是register(registry,new PackageInport(metadata).getPackafeName);
打开register方法,可以看到该方法主要为Spring容器注入了BasePackages(启动类所在的包路径)的beanDefinition(Bean定义)。目的是将启动类的包路径传入容器。官网解释在后面整合jpa时会用到
@Import({AutoConfigurationImportSelector.class}):导入自动配置选择器,主要方法:
selectImports()该方法执行包括两步:
第一步:先调用this.getAutoConfigurationEntry():getAutoConfigurationEntry包含几部分:
第二步:StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());通过工具类将实际生效的自动配置类数组ArrayList转换成数组。
以上是关于SpringBoot注解@SpringBootApplication注解的相关内容,下面介绍SpringApplication.run()的执行流程: