SpringBoot简介
SpringBoot来简化Spring应用开发,约定大于配置,去繁化简,是 Spring开源组织下的子项目框架。
SpringBoot能够简化配置文件,快速构建web应用,内置tomcat,无需打包部署,直接运行。
为什么要使用SpringBoot
传统的 SSM/SSH 框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率。
而 Spring Boot 对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。
SpringBoot工作原理
SpringBoot启动入口
我们开发任何一个Spring Boot项目,都会用到如下的启动类:
SpringBoot核心注解
我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,是非常重要的。
如下图所示:
分别是:
- @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执行流程
主要分为如下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面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》