零、前言
Spring简直是java企业级应用开发人员的春天,我们可以通过Spring提供的ioc容器,避免硬编码带来的程序过度耦合。但是,启动一个Spring应用程序也绝非易事,他需要大量且繁琐的xml配置,开发人员压根不能全身心的投入到业务中去。
因此,SpringBoot诞生了,虽然本质上还是属于Spring,但是SpringBoot的优势在于以下两个特点:
- 约定大于配置
SpringBoot定义了项目的基本骨架,例如各个环境的配置文件统一放到resource中,使用active来启用其中一个。配置文件默认为application.properties,或者yaml、yml都可以。
- 自动装配
以前在Spring使用到某个组件的时候,需要在xml中对配置好各个属性,之后被Spring扫描后注入进容器。
而有了SpringBoot后,我们仅仅需要引入一个starter,就可以直接使用该组件,如此方便、快捷,得益于自动装配机制。
一、定义
什么是SpringBoot的自动装配?
SpringBoot 自动装配,英文是 Auto-Configuration,是指在Spring Boot启动时,通过一系列机制和注解,将第三方组件或配置类加载到Spring容器中,并生成相应的Bean对象供使用。这一过程极大地简化了开发工作,提高了效率,为 SpringBoot 框架的 “开箱即用”提供了基础支撑;
具体来说,SpringBoot的自动装配主要依赖以下几个关键点:
- 注解:SpringBoot提供了多个注解来实现自动装配,例如
@SpringBootApplication
、@EnableAutoConfiguration
和@ComponentScan
等。这些注解帮助SpringBoot识别并加载需要自动配置的类。 - 条件化配置:SpringBoot利用条件化配置(
@Conditional
注解)来决定是否进行某些配置。例如,如果类路径下存在某个特定的jar包,则自动配置相应的功能。 - 元数据文件:SpringBoot会在启动时扫描
META-INF/spring.factories
文件,从中获取需要进行自动装配的类,并执行这些类中的配置操作。 - 场景启动器:SpringBoot还引入了场景启动器(如WebMvcAutoConfiguration),根据项目中添加的依赖自动配置相应的功能。
- 约定大于配置:SpringBoot遵循“约定大于配置”的原则,通过默认配置减少开发者手动编写配置的必要性。例如,在没有明确配置的情况下,SpringBoot会自动配置数据库连接、视图解析器等。
- SPI机制:自动装配与Spring的SPI(Service Provider Interface)机制相似,都是通过反射机制动态加载和实例化组件。更多SPI讲解:深入理解 Java SPI - 概念、原理、应用
二、启动流程
SpringBoot启动流程的简化版代码:
public static void run(Class<?> primaryClass) {
//1.创建一个 ApplicationContext 实例,即我们常说的IoC容器
ApplicationContext context = createApplicationContext();
// 2.将主类(primaryClass)注册到IoC容器中(简单但很重要的一步)
loadSourceCLass(context, primaryClass);
// 3.递归加载并处理所有的配置类
processConfigurationClasses(context);
// 4.实例化所有的单例Bean(Singleton Bean)
instantiateSingletonBeans(context);
// 5.如果时web应用,则启动web服务器(如Tomcat)
startWebServer(context);
}
图解:
详解第三步核心流程:
图解:
三、原理剖析
一切都从注解 @SpringBootApplication 说起:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
@SpringBootApplication 注解又是一个组合注解
@Target(ElementType.TYPE)