SpringBoot执行流程
- springboot启动类
该类必须在根目录或者父包(其它组件必须位于此包的子包中)中
必须有@SpringBootApplication注解,该注解说明此类为springboot程序的启动类,是程序的入口,
@SpringBootApplication源码: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Configuration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication { Class<?>[] exclude() default {}; String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {}; } |
@Configuration:表示将该类作用springboot配置文件类。
@EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置。@ComponentScan:表示程序启动是,自动扫描当前包及子包下所有类。
从源代码中得知 @SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、 @ComponentScan 注解所修饰,也就是说, Springboot 对这三个注解进行了封装整合,简化程序的配置。
程序启动时,会自动扫描启动类所在包及子包中的带有spring相关注解的组件,
- SpringBoot程序启动流程
SpringBoot程序启动时,启动类的main方法是程序的入口,执行
SpringApplication.run(BootApplication.class, args);
第一个参数为启动类的类对象,第二个为String可变参数,通常不写。
当程序开始启动时,在启动类中调用SpringApplication的静态run方法,此时会执行以下操作
- 首先新建一个SpringApplication对象
在SpingApplication对象的方法执行过程中
- 获取webApplicationType 类型,当springboot应用打包方式为war包时,该类型 为SERVLET
- 注入ApplicationContextInitializer初始化器
- 设置监听器ApplicationListener
2. 执行对象的run方法,
- 新建一个StopWatch,并启动用于监测程序运行时间
- 获取SpringApplicationRunListeners对象,并启动该监听器
- 根据启动时传入的参数args,新建ApplicationArguments对象
- 新建ConfigurableEnvironment对象,具体类型为StandardServletEnvironment,在其创建过程中将会加载springboot的配置文件application.properties,同时将其绑定的SpringApplication程序中
- 创建ConfigurableApplicationContext对象context,并对该对象设置环境属性,遍历ApplicationContextInitializer对该对象进行初始化,
- 通过context对象获取BeanFactory注册applicationArguments单列
- 执行context的刷新操作
3. 对配置的启动类所在包及子包中的类进行扫描,对于有spring相关注解的类,通过反射为其创建代理对象,并交由spring容器管理