SpringBoot加载启动的源码解析

 更新时间:2023年12月31日 08:49:46   作者:_Romeo  
这篇文章主要介绍了SpringBoot加载启动的源码解析,@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解,本身其实也是一个IoC容器的配置类,需要的朋友可以参考下

前言

@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:

在这里插入图片描述

  • @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
  • @EnableAutoConfiguration
  • @ComponentScan
    即 @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
    所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
		}
}

1、@Configuration

这里的@Configuration对我们来说不陌生,它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。

任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

@Configuration:提到@Configuration就要提到他的搭档@Bean。使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。

@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。 @Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

2、@ComponentScan

@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

【注】:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages

3、@EnableAutoConfiguration

  • 个人感觉 @EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?
  • 比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等
  • @EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
  • @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
  • @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
  • 而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!

4、总结

其实启动的主要过程都在new SpringApplication().run();

  • new SpringApplication():创建SpringApplication实例,负责加载配置一些基本的环境变量、资源、构造器、监听器
  • run():负责springboot整个启动过程,包括加载创建环境、打印banner、配置文件、配置应用上下文,加载bean等等sb整个生命周期几乎都在run方法中;

到此这篇关于SpringBoot加载启动的源码解析的文章就介绍到这了,更多相关SpringBoot加载启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java序列化与反序列化操作实例分析

    java序列化与反序列化操作实例分析

    这篇文章主要介绍了java序列化与反序列化操作,结合实例形式分析了java序列化与反序列化的概念与具体实现技巧,需要的朋友可以参考下
    2016-10-10
  • springBoot无法解析yml问题

    springBoot无法解析yml问题

    这篇文章主要介绍了springBoot无法解析yml问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java 策略模式 if-else用法实例详解

    Java 策略模式 if-else用法实例详解

    这篇文章主要介绍了Java 策略模式 if-else用法详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • SpringBoot项目打成War布署在Tomcat的详细步骤

    SpringBoot项目打成War布署在Tomcat的详细步骤

    这篇文章主要介绍了SpringBoot项目打成War布署在Tomcat,本文分步骤结合图文实例给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 深入解读分布式事务Seata的XA模式

    深入解读分布式事务Seata的XA模式

    这篇文章主要介绍了深入解读分布式事务Seata的XA模式,XA 规范 描述了全局的事务管理器与局部的资源管理器之间的接口,XA规范 的目的是允许的多个资源在同一事务中访问,这样可以使 ACID 属性跨越应用程序而保持有效,需要的朋友可以参考下
    2023-08-08
  • Java实现简易扑克牌游戏的完整实例

    Java实现简易扑克牌游戏的完整实例

    这篇文章主要介绍了Java实现简易扑克牌游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java语法之 Java 的多态、抽象类和接口

    Java语法之 Java 的多态、抽象类和接口

    上节介绍了 Java 基础语法之解析 Java 的包和继承,如果这类知识有点疑惑的小伙伴,可以去 Java 的包和继承 这章看看,或许可以帮你解决一些疑惑哟!今天这篇文章我们将讲解的是 Java 的多态、抽象类和接口,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • 超全MyBatis动态代理详解(绝对干货)

    超全MyBatis动态代理详解(绝对干货)

    这篇文章主要介绍了超全MyBatis动态代理详解(绝对干货),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    这篇文章主要介绍了Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)的相关资料,需要的朋友可以参考下
    2016-09-09
  • SpringBoot+Quartz实现动态定时任务

    SpringBoot+Quartz实现动态定时任务

    这篇文章主要为大家详细介绍了springBoot+Quartz实现动态定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09

最新评论