Springboot
的启动流程
1.启动SpringBootApplication 注解类的main ⽅法
2.初始化配置
main⽅法调⽤run⽅法⼜调⽤了启动类中的另⼀个静态run⽅法,通过实例化⼀个SpringApplication对象再次调⽤run⽅法
1import org.springframework.boot.SpringApplication;//启动类
2import org.springframework.boot.autoconfigure.SpringBootApplication;
3
4@SpringBootApplication//启动必要的注解
5public class SpringBootDemoApplication {
6    //运⾏main ⽅法启动springBoot
7    public static void main(String[] args) {
8        SpringApplication.run(SpringBootDemoApplication.class, args);//启动类的静态run ⽅法
9    }
10
11}
1public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
2  return new SpringApplication(primarySources).run(args);//实例化⼀个SpringApplication对象
3}
在实例化SpringApplication对象时,在构造函数中通过类加载器,加载classpath类路径下的多个jar包⾥的spring.factories配置⽂件,根据配置⽂件来创建⼀些初始配置对象,并创建了对象
1//构造⽅法
2public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
3  //。。。。。。。。。。
4        //(loadFactories)读取classpath下所有的spring.factories配置⽂件
5                // 配置应⽤程序启动前的初始化对象
6  setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
7              // 配置应⽤程序启动前的
8  setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
9  this.mainApplicationClass = deduceMainApplicationClass();
10 }
配置应⽤程序启动前的初始化对象步骤
getSpringFactoriesInstances()
获取初始化类的类名
通过类名实例化对象
读取运⾏环境中所有META-INF/spring.factories配置
3.执⾏run⽅法
1public ConfigurableApplicationContext args) {
2    //。。。。。。。。。
3  //通知
4  listeners.starting(bootstrapContext, this.mainApplicationClass);
5  try {
6      //1,创建应⽤程序环境对象,读取⽤户配置⽂件(application.properties  application.yaml)
7      ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
8    //2,创建应⽤程序上下⽂,在此处也创建了beanfactory
9      context = createApplicationContext();
10      //3,刷新应⽤程序上下⽂(启动的核⼼)
11      refreshContext(context);
12    //4,启动完成通知
13      listeners.started(context);
14
15  }
16  catch (Throwable ex) {
17      handleRunFailure(context, ex, listeners);
18      throw new IllegalStateException(ex);
19  }
20  try {
21      listeners.running(context);
22  }
23  catch (Throwable ex) {
24      handleRunFailure(context, ex, null);
25      throw new IllegalStateException(ex);
26  }
27  return context;
28}
创建应⽤程序上下⽂
在初始化和配置环境之后,开始创建应⽤程序上下⽂,creatApplicationContext();关键的⼯⼚BeanFatory在此时创建,默认创建的
是org.springframework.boot.t.AnnotationConfigServletWebServerApplicationContext
对象
创建⼯⼚对象
刷新应⽤上下⽂
创建好应⽤程序上下⽂后,开始刷新上下⽂refreshContext();实现⼯⼚配置,bean处理器配置,类的扫描,bean定义,bean类信息缓存,服务器创建,bean实例化,动态代理对象创建。
spring中的注册bean信息和实⼒化bean信息是两件事
注册bean信息不是创建bean 对象,⽽是解析bean类来获取详细信息,创建BeanDefination对象,携带bean类的字节码和⽅法等信息,把BeanDefinition对象保存到⼯⼚的BeanDefinitionMap
⼯⼚实例化Bean时,直接(beanName)获取bean的字节码信息,通过反射创建对象
配置⼯⼚对象beanFactory:包括上下⽂类加载器,bean⼯⼚发布处理器
注册并实例化bean⼯⼚发布处理器,并调⽤他们
注册并实例化Bean发布处理器:rigisterBeanPostProcessors
bean发布处理器⽣产AOP代理对象
初始化⼀些与上下⽂有特别关系的bean对象
默认tomacat服务器的创建就是此⽅法完成,此处定义特别的bean创建,⼀般是服务器有关或个性化对象
实例化所有Bean⼯⼚缓存的Bean对象
服务器启动后,创建spring⼯⼚⾥⾯缓存的bean 信息
发布通知—通知上下⽂刷新完成
通知监听者—启动程序完成
总结:
1.run⽅法中去创建⼀个SpringApplication 实例,在构造⽅法内,可以发现其调⽤⼀个初始化的Initialize⽅法,为SpringApplication对象赋初值
2.创建应⽤的SpringApplicationRunListeners并开始监听
3.加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,其最终也是继承了ConfigurableEnvironment
4.配置环境加⼊到对象中
5.创建run⽅法的返回对象,ConfigurableApplication(应⽤配置上下⽂),
⽅法会先获取显式设置的应⽤上下⽂(applicationContextClass),如果不存在,再加载默认的环境配置,默认选择AnnotationConfigApplicationContext注解上下⽂,最后通过BeanUnils实例化上下⽂对象,并返回。
springboot aop6.回到run⽅法内,prepareContext⽅法将Listeners、environment、applicationArguments、banner等重要组件与上下⽂对象关联
7.接下来的refreshContext⽅法将实现spring-boot-starter-*(mybatis、redis等)⾃动化配置的关键,包括spring.factories的加
载,bean的实例化等核⼼⼯作

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。