spring boot启动类
在使用springboot的时候,我们可以很明显的感觉到,脱离了之前繁杂的配置,在构建项目的时候非常的快捷。那么spring boot是怎么帮我们避免手动配置,自动装配的呢? 我们在构建项目的时候,我们都会创建一个spring boot启动类,而这个启动类就是解开它神秘面纱的入口!
从上图可以看出,启动类中关键的就是@SpringBootApplication注解和SpringApplication.run(QuickStartApplication.class,args);
run方法加载启动类的字节码文件,这样就可以识别@SpringBootApplication注解。
@SpringBootApplication注解
@SpringBootApplication注解其实是一个复合注解,它里面包含三个关键的注解。 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
- @SpringBootConfiguration 它实际上是应用了@Configuration,就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration。他们作用相同,都是用来表示当前类是一个可以被组件扫描器扫描的配置类。
-@ComponentScan @ComponentScan在spring中是一个组件扫描注解,它可以自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
- @EnableAutoConfiguration 这个注解最为重要,它作为一个复合注解,其核心注解如下:
两个比较重要的注解:
@AutoConfigurationPackage:自动配置包
@Import: 导入自动配置的组件
- AutoConfigurationPackage注解:
它其实是注册了一个Bean的定义。 new PackageImport(metadata).getPackageName(),它其实返回了当前主程序类的同级以及子级的包组件。这也就是为什么要把启动类放到最外层包里
- Import(AutoConfigurationImportSelector.class)注解:
可以从图中看出 AutoConfigurationImportSelector 继承了 DeferredImportSelector 继承了 ImportSelector 它其实是去加载 public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";外部文件。这个外部文件,有很多自动配置的类。
总结:
- 第一个注解是 @SpringBootConfiguration,底层是一个@Configuration注解,表示当前类是一个配置类
- 第二个注解是@ComponentScan,是一个组件扫描,spring会扫描引导类所在的包及子包下的组你
- 第三个注解是@EnableAutoConfiguration,底层是通过@Import注解导入一个AutoConfigurationImportSelector配置类,这个配置类会自动调用 selectImports 方法,这个方法会去扫描 META-INF/spring.factories的文件中Key为EnableAutoConfiguration的所有数据,同时还会扫描 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的数据,再经过@CondtionalXxx的条件判断,把满足条件的内容加载到内存中,封装成一字符串数组