深入探索SpringBoot启动与自动配置原理

目录

  1. Spring Boot简介

  2. Spring Boot启动原理

  3. Spring Boot自动配置原理

  4. 总结

  5. 参考资料

1. Spring Boot简介

Spring Boot是Spring框架的一个子项目,它简化了使用Spring框架开发新Spring应用的过程。其核心功能包括:

  • 自动化配置

  • 嵌入式服务器支持(如Tomcat、Jetty、Undertow)

  • 对开箱即用的微服务架构的支持

  • 极简的Maven、Gradle配置

它的“约定优于配置”理念减少了开发人员在项目初始化和配置上的重复劳动,从而加快了开发进度并提高了生产力。

2. Spring Boot启动原理

Spring Boot应用的启动过程主要围绕SpringApplication类进行。下面是详细的启动架构解析。

SpringApplication类

SpringApplication是Spring Boot的核心类之一,提供了一种便捷的方式来启动Spring应用程序。在典型的Spring Boot应用中,main方法如下:


public static void main(String[] args) {

    SpringApplication.run(Application.class, args);

}

SpringApplication.run方法通常会做以下几件事:

  1. 创建一个SpringApplication实例:可以传入多个配置类,也可以为空。

    
    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    
        return new SpringApplication(primarySources).run(args);
    
    }
    
    
  2. 推断应用的类型:Web应用或非Web应用。

    
    private void deduceApplicationType() {
    
        if (ClassUtils.isPresent("javax.servlet.Servlet", null) && !WebApplicationType.NONE.equals(webApplicationType)) {
    
            this.webApplicationType = WebApplicationType.SERVLET;
    
        }
    
        // 还支持 Reactive Web 类型
    
    }
    
    
  3. 加载应用上下文初始器和监听器

    
    ApplicationContextInitializer<?> initializers = getSpringFactoriesInstances(
    
        ApplicationContextInitializer.class);
    
    this.initializers = Collections.unmodifiableList(initializers);
    
    
    
    // 同样的方式加载应用监听器
    
    SpringApplicationRunListeners listeners = getRunListeners(args);
    
    listeners.starting();
    
    
  4. 创建并初始化ApplicationContext

    
    ConfigurableApplicationContext context = createApplicationContext();
    
    prepareContext(context, environment, listeners, applicationArguments, printedBanner);
    
    // 调用Refresh方法刷新容器
    
    refreshContext(context);
    
    

ApplicationContext初始化

prepareContext方法主要执行几项重要任务,包括:

  • 设置环境变量。

  • 应用所有的ApplicationContextInitializer

  • 通知所有的ApplicationListener

完成这些任务之后,refreshContext方法会调用ConfigurableApplicationContextrefresh方法进行上下文激活。

Lifecycle回调接口

Spring Boot在不同生命周期阶段会触发特定的回调,这些回调方法都在SpringApplicationRunListeners中触发,如:

  • starting:应用启动时触发

  • environmentPrepared:环境变量准备完成后触发

  • contextPrepared:上下文准备完成后触发

  • contextLoaded:上下文加载完成后触发

  • started:上下文启动完成后触发

  • running:应用启动完毕并处于运行状态

  • failed:启动过程中出现异常

3. Spring Boot自动配置原理

自动配置是Spring Boot的重要特性之一,其核心注解是@EnableAutoConfiguration。理解它的工作原理有助于我们更好地使用和扩展Spring Boot。

自动配置的关键注解@EnableAutoConfiguration

@EnableAutoConfiguration是一个复合注解,它使用了@Import注解来导入了名为AutoConfigurationImportSelector的选择器类。


@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(AutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

}

如何工作:SpringFactoriesLoader

AutoConfigurationImportSelector内部借助于SpringFactoriesLoader来加载所有配置类。


@Override

public String[] selectImports(AnnotationMetadata annotationMetadata) {

    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

    configurations = removeDuplicates(configurations);

    configurations = sort(configurations);

    return configurations.toArray(new String[0]);

}



protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {

    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");

    return configurations;

}

条件注解@Conditional

大部分自动配置类都是基于某些条件加载的,这些条件由@Conditional注解来定义,如:

  • @ConditionalOnClass

  • @ConditionalOnMissingBean

  • @ConditionalOnProperty

这些条件类帮助我们实现条件装配,确保只有在符合特定条件下才加载相关的Bean配置。


@Configuration

@ConditionalOnClass(DataSource.class)

@EnableConfigurationProperties(DataSourceProperties.class)

public class DataSourceAutoConfiguration {

    // DataSource自动配置逻辑

}

自动配置类的编写与加载

要编写自动配置类,我们通常需要:

  1. 创建配置类并使用@Configuration注解标注。

  2. 使用条件注解来限定配置类的启用条件。

  3. 将配置类的全限定类名添加到META-INF/spring.factories文件中。


# META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

com.example.MyAutoConfiguration

4. 总结

Spring Boot的启动过程和自动配置机制是其高生产力的基础。对这些机制的理解不仅能帮助我们更好地使用Spring Boot,还能帮助我们在需要时进行扩展和定制。

  • 启动过程SpringApplication类引导启动,加载并初始化ApplicationContext,触发不同生命周期的回调。

  • 自动配置@EnableAutoConfiguration结合SpringFactoriesLoader实现自动配置类的加载,基于条件注解实现条件装配。

通过这篇文章,希望读者能够深刻理解Spring Boot的启动和自动配置原理,为日常开发提供更深入的支持。

5. 参考资料

  1. Spring Boot官方文档

  2. Spring Framework源码

  3. Spring Boot GitHub项目

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一休哥助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值