说springboot的启动流程固然少不了springboot启动入口类java
@SpringBootApplication public class SpringBootWebApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(SpringBootWebApplication.class); application.run(args); } }
以上代码很容易看出哪些是关键,固然是@SpringBootApplication和application.run()分别是springboot加载配置和启动,下面详细说明这两块。web
@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 { }
其中@Configuration(@SpringBootConfiguration中其实用的也是@Configuration);@EnableAutoConfiguration;@ComponentScan三个是最重要的注解,@SpringBootApplication整合了三个注解使用者写起来看起来都比较简洁。spring
它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,这里的启动类标注了@Configuration以后,自己其实也是一个IoC容器的配置类。以下案例说明xml和注解实现bean的定义springboot
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> <!--bean定义--> </beans>
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
@EnableAutoConfiguration简单的说它的做用就是借助@Import的支持,收集和注册特定场景相关的bean定义。其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration能够帮助SpringBoot应用将全部符合条件的@Configuration配置都加载到当前SpringBoot建立并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持很智能的自动配置:app
SpringFactoriesLoader其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项经过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,而后汇总为一个并加载到IoC容器。(以下页面模版的配置)框架
1.3.1 当咱们运行SpringApplication的main方法时,调用静态方法run()首先是实例化,SpringApplication初始化的时候主要作主要作三件事:工具
1.3.2 SpringApplicatio实例化完成而且完成配置后调用run()方法,首先遍历初始化过程当中加载的SpringApplicationRunListeners,而后调用starting(),开始监听springApplication的启动。spa
1.3.3 加载SpringBoot配置环境(ConfigurableEnvironment),若是是经过web容器发布,会加载StandardEnvironment。将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)。code
1.3.4 banner属性的设置xml
1.3.5 ConfigurableApplicationContext(应用配置上下文)建立,根据webEnvironment是不是web环境建立默认的contextClass
,AnnotationConfigEmbeddedWebApplicationContext(经过扫描全部注解类来加载bean)和ConfigurableWebApplicationContext),最后经过BeanUtils实例化上下文对象,并返回。
1.3.6 prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
1.3.7 refreshContext(context),bean的实例化完成IoC容器可用的最后一道工序。
1.3.8 最后springboot作一些收尾工做。自此springboot的简单流程到此结束。