首页 > 其他分享 >决战圣地玛丽乔亚Day43

决战圣地玛丽乔亚Day43

时间:2023-03-28 18:56:13浏览次数:26  
标签:乔亚 spring 配置 玛丽 自动 Spring factories Day43 加载

Springboot的自动装配原理:

@SpringBootApplication

 

 

进入 AutoConfigurationImportSelector类中,会调用 selectImports(方法),用于选择需要自动配置的类,并返回它们的全限定类名数组

AnnotationMetadata 是被注解修饰的类或方法的元数据

这个selectImports主要获取被@Import注解修饰的类的元数据信息。该方法的主要作用是根据一些条件,选择需要导入的自动配置类。 具体来说,该方法的实现逻辑如下:

  1. 首先通过isEnabled方法判断当前是否需要执行自动配置导入操作。
  2. 如果需要执行自动配置导入操作,则通过AutoConfigurationMetadataLoader.loadMetadata方法加载自动配置元数据,并通过getAutoConfigurationEntry方法获取自动配置实体。
  3. 最后,通过autoConfigurationEntry.getConfigurations方法获取需要导入的自动配置类,并转换为String数组返回。

第一步.首先看一下loadMetadata

AutoConfigurationMetadataLoader读取classpath下的所有文件的META-INF/spring-autoconfigure-metadata.properties文件,并将其中的元数据信息合成到一起加载到AutoConfigurationMetadata接口的实现类中。

在加载完成后,获得一个合并了各种自动配置元数据的AutoConfigurationMetadata就可以用于支持自动配置的各种功能,例如条件判断、自动配置类的加载等。   参数classLoder是类加载器,用于加载自动配置元数据信息。

 

第二步.

 

 

 这个方法用于返回自动配置类的全限定类名、条件匹配器、属性源。并把他们封装在AutoConfigurationImportSelector类的内部类AutoConfigrationEntry中

看源码:

 

 

 

这里使用SpringFactoriesLoader来加载JAR包下面的META-INF/spring.factories文件

例如:spring-boot-autoconfigure-2.1.14.RELEASE.jar

 下面的META-INF/spring.factories  很多东西。

 

 

 

 

 

 

 

 

 

 

 

        首先,该方法会从缓存中查找是否已经加载过该类加载器的spring.factories文件,如果已经加载过,则直接返回缓存中的结果。

   如果缓存中没有该类加载器的结果,则会使用指定的类加载器或系统类加载器(如果指定的类加载器为null)加载META-INF/spring.factories文件,获取该文件中所有自动配置类的类名和对应的自动配置类名列表

  对于每一个找到的spring.factories文件,该方法会使用PropertiesLoaderUtils.loadProperties()方法加载该文件中的所有属性,然后遍历每一个属性,将所有的属性值保存为一个列表返回。

      最后,该方法会将所有自动配置类名和自动配置类名列表保存到一个MultiValueMap对象中,并将该对象缓存在cache中,以便下次使用同一个类加载器时可以直接返回缓存中的结果。 综上所述,该方法实现了从META-INF/spring.factories文件中加载自动配置类的功能,并使用缓存提高了性能。

 

getAutoConfigrationEntry最终返回的自动配置条目封装类:

  1. configurations:自动配置类的全限定类名,也就是实现自动配置的类。
  2. exclusions:排除自动配置的类的全限定类名数组。
  3. matched:是否匹配自动配置条件的标志,如果为false,则表示不需要自动配置。
  4. metadataReader:自动配置类的元数据读取器,用于读取自动配置类的元数据信息。
  5. propertySourceNames:属性源的名称数组,用于获取自动配置类的属性值。
  6. resource:自动配置类的资源对象,用于定位自动配置类的位置。

最后一步:

 

 

 这行代码的作用是获取自动配置类的全限定类名数组,并将其转换成字符串数组返回。

其中,autoConfigurationEntry表示上面第二步获取的自动配置条目,getConfigurations()方法是AutoConfigurationEntry类中的方法,用于获取自动配置类的全限定类名数组。

最后我们就拿到了所有需要自动配置类的全限定名。

在后续Springboot用到某个功能,会检查自动配置类是否存在,如果存在会通过全限定名进行加载。

 

总结:

Spring Boot是通过Spring框架的@EnableAutoConfiguration注解和spring.factories文件来实现自动检查和自动加载自动配置类的。 具体来说,当我们在应用程序中使用某个特定的功能时,Spring Boot会自动检查该功能所需的自动配置类是否存在。具体的检查过程如下:

  1. Spring Boot会扫描classpath下所有的META-INF/spring.factories文件,寻找其中所有实现了org.springframework.boot.autoconfigure.EnableAutoConfiguration接口的自动配置类。
  2. Spring Boot会根据当前应用程序的类路径和配置文件,确定需要的自动配置类,并将其传递给spring.factories文件中所有自动配置类让他们自行检查是否满足条件(有一些是用了Conditional条件的)。
  3. 如果自动配置类中的ConditionalOnXXX注解所指定的条件成立,那么该自动配置类就会被Spring Boot自动加载。 具体的自动加载过程如下:

 

Spring Boot会将所有需要自动配置的类的相关信息封装为AnnotationMetadata传递给EnableAutoConfigurationImportSelector类的selectImports()方法。

selectImports()方法会根据需要自动配置的功能列表和spring.factories文件中的自动配置类,生成一个自动配置类的全限定名数组。

Spring Boot会将该全限定名数组传递给AnnotationConfigApplicationContext类的构造函数,以便在应用程序启动时自动加载这些自动配置类。

cause:

AnnotationConfigApplicationContext类的构造函数可以接受一个或多个Java配置类的全限定名作为参数,这些配置类会被用来自动化配置应用程序的各个部分。在应用程序启动时,AnnotationConfigApplicationContext会读取这些配置类,然后根据其中的Bean定义来创建Bean实例,并将它们注册到应用程序上下文中。如果这些配置类中定义了一些自动配置类,那么这些自动配置类也会被加载并应用到应用程序中去。

综上所述,Spring Boot是通过@EnableAutoConfiguration注解和spring.factories文件来实现自动检查和自动加载自动配置类的。通过这种方式,Spring Boot可以根据当前应用程序的需求,自动加载所需的自动配置类,从而简化了应用程序的配置过程。

标签:乔亚,spring,配置,玛丽,自动,Spring,factories,Day43,加载
From: https://www.cnblogs.com/dwj-ngu/p/17263685.html

相关文章

  • 决战圣地玛丽乔亚Day40---Spring框架01
    springSpring启动过程?1.初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中如果是注解的方式,会调用AnnotationConfigApplicationContext ......
  • 决战圣地玛丽乔亚Day39 -----GC、内存模型、类加载
    内存模型:java内存模型定义了JVM虚拟机如何与计算机的内存进行交互。java内存模型把内存划分为两部分:主内存和工作内存。主内存共享,工作内存线程私有。java内存模型的实现......
  • 决战圣地玛丽乔亚Day33 ---Synchronized && volatile
    再Synchronized和ReetrantLock的区别:1.Synchronized可以对静态方法,普通方法,代码块加锁。自动加锁释放锁。ReetrantLock需要手动的加锁释放锁,加锁前需要创建一个ReetrantLo......
  • 决战圣地玛丽乔亚Day
    今日目标(AQS):AQS(抽象队列同步器):相当于实现锁的一系列模板方法。如果要实现锁,需要:1.锁是否被占用的状态值。2.阻塞/唤醒3.竞争失败的队列AQS中:state:状态信息,不同......
  • 决战圣地玛丽乔亚Day25-----慢查询优化和索引优化
    建索引的几大原则1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=1andb=2andc>3andd=4如果......
  • 决战圣地玛丽乔亚Day24
    高性能Mysql第四版P190~204 学习记录:联接查询:  对于Union查询,mysql先把一系列单个查询放在临时表,然后再重新读出临时表中的数据完成Union查询。在Mysql的概念中,联接......
  • 决战圣地玛丽乔亚Day19---
    聚簇索引和非聚簇索引:聚簇和非聚簇的含义是:是否索引和数据进行绑定,即是否需要二次查找才能找到对应的数据值。由于聚簇索引的绑定关系,要求聚簇索引是唯一值,否则不能明确通......
  • 决战圣地玛丽乔亚Day18----关于mysql死锁+ mysql索引的数据结构相关
    Mysql为什么会产生死锁? 事务A、B分别拿到1,4的独占行锁,然后再去拿4,1的行锁,都会由于另一个事务不释放锁等待,造成了循环等待的局面。(1)同一时刻只能有一个事务持有这......
  • 决战圣地玛丽乔亚Day17 ----意向锁/MDL锁
    MYSQL的行锁:独占锁、共享锁表锁:除了独占锁共享锁之外,还有意向锁和MDL锁。意向锁:意向锁是一种不与行级锁冲突表级锁。意向锁数据引擎自己维护,自己无法去操作。在为数据......
  • 决战圣地玛丽乔亚Day16 --- 算法两道+ 独占锁/共享锁学习
    算法部分:复习一下二叉树的题目:简单的前中后序遍历:解二叉树的题目的逻辑:1.确定入参和返参2.确定终止条件3.确认每层的逻辑例如简单的后续遍历。  后续遍历是左右中......