SpringBoot原理(启动注解原理及流程详解)

SpringBoot原理(启动注解原理及流程详解)-mikechen

SpringBoot简介

SpringBoot来简化Spring应用开发,约定大于配置,去繁化简,是 Spring开源组织下的子项目框架。

SpringBoot能够简化配置文件,快速构建web应用,内置tomcat,无需打包部署,直接运行。

 

为什么要使用SpringBoot

传统的 SSM/SSH 框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率。

而 Spring Boot 对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。

 

SpringBoot工作原理

SpringBoot启动入口

我们开发任何一个Spring Boot项目,都会用到如下的启动类:

SpringBoot原理(启动注解原理及流程详解)-mikechen

SpringBoot核心注解

我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,是非常重要的。

如下图所示:

SpringBoot原理(启动注解原理及流程详解)-mikechen

分别是:

  • @SpringBootConfiguration;
  • @ComponentScan;
  • @EnableAutoConfiguration;

虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation,下面分别谈谈这三个核心注解的作用。

 

配置@Configuration注解

@SpringBootConfiguration点开查看发现里面还是应用了@Configuration。

这里的@Configuration对我们来说不陌生,它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration。

SpringBoot推荐使用基于JavaConfig的配置形式,所以这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。

比如:我们先定义一个IOC配置Bean:

<beans>
    <bean id = "car" class="com.test.Car">
        <property name="wheel" ref = "wheel"></property>
    </bean>
    <bean id = "wheel" class="com.test.Wheel"></bean>
</beans>

再使用@Configuration注解:

@Configuration
public class Conf {
    @Bean
    public Car car() {
        Car car = new Car();
        car.setWheel(wheel());
        return car;
    }

    @Bean
    public Wheel wheel() {
        return new Wheel();
    }
}

@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。

 

组件扫描@ComponentScan注解

组件扫描其实很简单,@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。

比如:

@ComponentScan(“com.mikechen.test”)
@SpringBootApplication
public class SpringbootApplication {

这么做扫描的范围扩大到整个父包com.mikechen.test包。

@ComponentScan注解默认就会装配标识了:

  • @Controller
  • @Service
  • @Repository
  • @Component

等这些注解的类到spring容器中。

 

自动配置@EnableAutoConfiguration

Spring Boot自动配置注解,开启这个注解之后,此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
 
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
 
    Class<?>[] exclude() default {};
 
    
    String[] excludeName() default {};
 
}

其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class)。

 

EnableAutoConfigurationImportSelector

借助EnableAutoConfigurationImportSelector可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

就像一只“八爪鱼”一样,借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成。

SpringBoot原理(启动注解原理及流程详解)-mikechen

SpringBoot执行流程

SpringBoot原理(启动注解原理及流程详解)-mikechen

主要分为如下11个步骤:

1)创建 Spring Application 实例,调用 run 方法,同时将启动入口类作 为参数传递进去,由此开始了 Spring Boot 内部相关核心组件以及配置的 启动和加载;

2)通过 Spring Factories Loader 加载 META-INF/spring.factories 文 件;

3)然后由 SpringApplicationRunListener 来发出 starting 消息;

4)创建参数,并配置当前 SpringBoot 应用需要使用的 Environment 实 例;

5)完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息;

6)创建 Spring 的应用上下文实例:ApplicationContext,初始化该实例 并设置应用环境配置实例:Environment,同时加载相关的配置项;

7)由 SpringApplicationRunListener 发出 contextPrepared 消息,告 知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;

8)将各种 Bean 组件装载入 Spring 的 IO 容器/应用上下文: ApplicationContext 中,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;

9)重新刷新 Refresh Spring 的应用上下文实例:ApplicationContext, 完成 IOC 容器可用的最后一步;

10)由 SpringApplicationRunListener 发出 started 消息,完成最终的 程序的启动;

11)由 SpringApplicationRunListener 发出 running 消息,告知程序已 成功运行起来了。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法