简单分析SpringBoot执行流程

SpringBoot执行流程

 

  1. 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相关注解的组件,

  1. SpringBoot程序启动流程

SpringBoot程序启动时,启动类的main方法是程序的入口,执行

SpringApplication.run(BootApplication.class, args);

第一个参数为启动类的类对象,第二个为String可变参数,通常不写。

 

当程序开始启动时,在启动类中调用SpringApplication的静态run方法,此时会执行以下操作

  1. 首先新建一个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容器管理

 

猜你喜欢

转载自blog.csdn.net/u010851067/article/details/81413392
今日推荐