一、应用的入口是SpringBoot启动类
启动类位置在项目的根目录,为什么要在根目录?
启动类的main方法启动的时候,项目主程序启动类要定义在最外层的根目录位 置,然后在根目录位置内部建立子包和类进行业务开发,这样才能够保证定义的类能够被组件扫描器扫描
可被扫描的组件有哪些?
@Component,@Controller,@Service,@Repository,等等具体作用就不介绍了,用过spring的兄弟都懂。
二、@SpringBootApplication包含的三个重要注解
1. @SpringBootConfiguration
表明该类为配置类,底层还是spring的@configuration注解,标识一个可以被组件扫描器扫描的配置类
2.@EableAutoConfiguration
简述:借助@Import注解的支持,收集和注册特定场景的bean
该注解下又分为以下两个重要的注解
(1)@AutoConfigurationPackage
@AutoConfigurationPackage注解的主要作用就是将主程序类所在包及所有子包下的组件到扫描到spring容器中。
(2)@Import(AutoConfigurationImportSelector.class)
@Import是Spring提供的注解,目的就是将所有符合自动配置条件的bean定义加载到IoC容器
AutoConfigurationImportSelector类作用 是通过selectImports方法执行的过程中,会使用内部工具类SpringFactoriesLoader,查找 classpath上所有jar包中的META-INF/spring.factories进行加载,实现将配置类信息交给 SpringFactory加载器进行一系列的容器创建过程
3.@ComponentScan
这个注解是spring提供的,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
三、底层实现自动配置的步骤
-
Springboot应用启动;
-
@SpringBootApplication起作用;
-
@EnableAutoConfiguration;
-
@AutoConfigurationPackage:这个组合注解主要是 @Import(AutoConfigurationPackages.Registrar.class),它通过将Registrar类导入到容器中,而 Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到springboot创建管理 的容器中;
-
@Import(AutoConfigurationImportSelector.class):它通过将 AutoConfigurationImportSelector类导入到容器中,AutoConfigurationImportSelector类作用 是通过selectImports方法执行的过程中,会使用内部工具类SpringFactoriesLoader,查找 classpath上所有jar包中的META-INF/spring.factories进行加载,实现将配置类信息交给 SpringFactory加载器进行一系列的容器创建过程
四、整体启动流程
1.获取并启动监听器
this.getRunListeners(args)和listeners.starting()方法主要用于获取SpringApplication实例初始化过程中初始化的SpringApplicationRunListener监听器并运行。
2.根据SpringApplicationRunListeners以及参数来准备环境
this.prepareEnvironment(listeners, applicationArguments)方法主要用于对项目运行环境进 行预设置,同时通过this.configureIgnoreBeanInfo(environment)方法排除一些不需要的运行环境
3.创建Spring容器
根据webApplicationType进行判断, 确定容器类型,如果该类型为SERVLET类型,会通过反射装载 对应的字节码,也就是AnnotationConfigServletWebServerApplicationContext,接着使用之前 初始化设置的context(应用上下文环境)、environment(项目运行环境)、listeners(运行监听 器)、applicationArguments(项目参数)和printedBanner(项目图标信息)进行应用上下文的组 装配置,并刷新配置
4.Spring容器前置处理
这一步主要是在容器刷新之前的准备动作。设置容器环境,包括各种变量等等,其中包含一个非常关键的操作:将启动类注入容器,为后续开启自动化配置奠定基础
5.刷新容器
开启刷新spring容器,通过refresh方法对整个IOC容器的初始化(包括bean资源的定位,解析,注册等 等),同时向JVM运行时注册一个关机钩子,在JVM关机时会关闭这个上下文,除非当时它已经关闭
6.Spring容器后置处理
扩展接口,设计模式中的模板方法,默认为空实现。如果有自定义需求,可以重写该方法。比如打印一些启 动结束log,或者一些其它后置处理。
7.发出结束执行的事件
获取EventPublishingRunListener监听器,并执行其started方法,并且将创建的Spring容器传进去 了,创建一个ApplicationStartedEvent事件,并执行ConfigurableApplicationContext 的 publishEvent方法,也就是说这里是在Spring容器中发布事件,并不是在SpringApplication中发布 事件,和前面的starting是不同的,前面的starting是直接向SpringApplication中的监听器发布启 动事件。
8.执行Runners
用于调用项目中自定义的执行器XxxRunner类,使得在项目启动完成后立即执行一些特定程序。其中, Spring Boot提供的执行器接口有ApplicationRunner 和CommandLineRunner两种,在使用时只需要自定义一个执行器类实现其中一个接口并重写对应的run()方法接口,然后Spring Boot项目启动后会立即执行这些特定程序
网友评论