SpringBoot自动配置与启动流程详细分析

 更新时间:2022年11月05日 09:53:10   作者:OlaiolaiO  
这篇文章主要介绍了SpringBoot自动配置原理分析,SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点

一、自动配置

主启动类

//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
   public static void main(String[] args) {
     //以为是启动了一个方法,没想到启动了一个服务
      SpringApplication.run(SpringbootApplication.class, args);
   }
}

@SpringBootApplocation注解内部

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    // ......
}

1. @ComponentScan

这个注解在Spring中很重要,它对应XML配置中的元素。

作用:自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。

2. @SpringBootConfiguration

作用:SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;

@Configuration 作用:允许在上下文中注册额外的bean或倒入其他配置类

//@SpringBootConfiguration注解内部
//这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;
@Configuration
public @interface SpringBootConfiguration {}
//里面的 @Component 这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用
@Component
public @interface Configuration {}

3. @EnableAutoConfigeration

作用:启用SpringBoot的自动配置机制

import java.lang.annotation. Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
@Target({ElementTypeTYPE})
@Retention(RetentionPolicy.RUNTIME)@Documented
@Inherited
@AutoconfigurationPackage
@Import( {AutoconfigurationImportselector.class})
public @interface EnableAutoconfiguration{
    string ENABLED_OVERRIDE_PROPERTY ="spring.boot.enableautoconfiguration" ;
    class<?>[]exclude() default {};
    string[ ] excludeName( ) default {};
}

@AutoConfigurationPackage :自动配置包

//AutoConfigurationPackage的子注解
//Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

@EnableAutoConfigeration 注解通过Spring提供的 @Import 注解导入了 AutoConfigurationImportSelector 类; AutoConfigurationImportSelector 类中 getCandidateConfigurations 方法会将所有自动配置类的信息以List的形式返回,这些配置信息会被Spring容器作Bean来管理。

 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
    }

4. @Condition

在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。

  • ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
  • ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
  • ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
  • ConditionalOnBean:判断环境中有对应Bean才初始化Bean

以上注解在springBoot-autoconfigure的condition包下。

总结原理

  • @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类;
  • 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean;
  • 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean。

启动流程

  • 基于SpringBoot开发的项目中都会有一个@SpringBootApplication注解配置的启动类,启动类中会有一个main()方法作为启动入口,main()方法中调用SpringApplication.run(),开始启动整个SpringBoot应用程序;
  • SpringApplication.run()方法中,首先进行初始化,创建SpringApplication对象,通过它的构造方法,完成初始化,读取自动配置核心类;
  • 通过执行SpringApplication对象的run()方法,完成SpringBoot应用程序的启动逻辑:启动流程的监听、配置环境、打印启动Banner、创建Spring容器、记录启动时间、执行Runner(ApplicationRunner和CommandLineRunner)等启动步骤。

到此这篇关于SpringBoot自动配置与启动流程详细分析的文章就介绍到这了,更多相关SpringBoot自动配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java反射机制,如何将一个实体类所有字段赋值为null

    Java反射机制,如何将一个实体类所有字段赋值为null

    这篇文章主要介绍了Java反射机制,如何将一个实体类所有字段赋值为null,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 微服务领域Spring Boot自动伸缩的实现方法

    微服务领域Spring Boot自动伸缩的实现方法

    这篇文章主要给大家介绍了关于微服务领域Spring Boot自动伸缩的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Java文件断点续传实现原理解析

    Java文件断点续传实现原理解析

    这篇文章主要介绍了Java文件断点续传实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java 对象的克隆(浅克隆和深克隆)

    java 对象的克隆(浅克隆和深克隆)

    这篇文章主要介绍了java 对象的克隆的相关资料,这里对浅克隆和深克隆进行了实例分析需要的朋友可以参考下
    2017-07-07
  • SpringMVC后端Controller页面跳转的三种方式汇总

    SpringMVC后端Controller页面跳转的三种方式汇总

    这篇文章主要介绍了SpringMVC后端Controller页面跳转的三种方式汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • SpringBoot使用minio进行文件管理的流程步骤

    SpringBoot使用minio进行文件管理的流程步骤

    MinIO 是一个高性能的对象存储系统,兼容 Amazon S3 API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文给大家介绍了SpringBoot使用minio进行文件管理的流程步骤,需要的朋友可以参考下
    2025-01-01
  • 使用Java实现类似Comet风格的web app

    使用Java实现类似Comet风格的web app

    这篇文章主要介绍了使用Java实现类似Comet风格的web app的方法,包括客户端的响应和XML解析等功能,需要的朋友可以参考下
    2015-11-11
  • SpringBoot Mybatis Plus公共字段自动填充功能

    SpringBoot Mybatis Plus公共字段自动填充功能

    这篇文章主要介绍了SpringBoot Mybatis Plus公共字段自动填充功能的相关资料,需要的朋友可以参考下
    2017-04-04
  • mybatis项目兼容mybatis-plus问题

    mybatis项目兼容mybatis-plus问题

    这篇文章主要介绍了mybatis项目兼容mybatis-plus问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 在webservice里调用耗时方法出错的解决方案

    在webservice里调用耗时方法出错的解决方案

    这篇文章主要介绍了在webservice里调用耗时方法出错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论