SpringBoot已经成为Spring的主流框架了,经典的自动配置大大解放了开发的双手,今天就来简析一下SpringBoot的启动流程:
话不多说,直接撸铁:正常我们的SpringBoot启动类:
@SpringBootApplication public class Demo1Application { public static void main(String[] args) { SpringApplication.run(Demo1Application.class, args); } }
启动类的关键在于 @SpringBootApplication 这个注解,那我们就进去看下这个注解:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { ...... }
从代码片段中可以看出,@SpringBootApplication 是一个复合型注解的接口,有一些默认接口方法,我们只关心三个注解,分别是:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
①. @SpringBootConfiguration :
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类;JavaConfig形式的IOC配置类。
②. @EnableAutoConfiguration:
作用简而言之就是将符合条件的@Configuration加载到IOC容器中去,这个注解的幕后使者是SpringFactoriesLoader,这个类的功能是:从META-INF/Spring.factories加载配置
③.@ComponentScan:
自动扫描,ComponentScan做的事情就是告诉Spring从哪里找到bean;
例:@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"}) @Configuration public class SpringConfiguration { 相比于xml: <context:component-scan base-package="com.in28minutes.package1, com.in28minutes.package2" />