zoukankan      html  css  js  c++  java
  • 聊一聊 SpringBoot 自动配置的原理

    解析思路

    我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究。

    开始解析

    首先我们建立一个 Springboot的工程。找到启动类,我们看到启动类上有一个注解@SpringBootApplication。我们从这开始。

    我们通过idea点进去看看

    这是两个关键的注解,我们先来看一下@SpringBootConfiguration里面是个啥。

    发现就是个普通的@Configuration注解,至此,破案。
    我们要重点来看@EnableAutoConfiguration注解。这个注解可以说是SpringBoot实现自动配置的关键。
    点进去看一下,发现他引入了这么一个class类,顺嘴提一下,这个import注解关键啊。他这个注解就是类似,我们将多个xml文件写入到一个xml文件中的情况。所以我们得看看他这个都导入了什么。继续点击,AutoConfigurationImportSelector进去看看

    来到AutoConfigurationImportSelector类中。
    我们首先来看他重写的方法selectImports。

    两个方法,loadMetadata和getAutoConfigurationEntry
    我们先看loadMetadata,loadMetadata 打了个断点看了一下,大致就是说去找spring-autoconfigure-meatadata.properties。
    将这个配置文件搞成一个配置文件类,返回。这个配置文件中存在的东西就是自动配置类的对应关系。
    第二个方法getAutoConfigurationEntry

    这里面又继续调用了这个方法

    这个loadFactoryNames方法所进行的事,就是去查找META-INF/spring.factories文件中包含的JAR文件。

    spring.factories在org.springframework.boot.autoconfigure的jar下

    进去发现,里面有各种各样的自动配置类。

    回到之前的selectImports的方法,返回的是一个数组,将这些类文件以数组形式返回。这样我们的之前在spring.factrory里面看到的那些自动配置类就全部加载到容器中了。
    容器中有了这些类,我们自然是来看看这些类中都有什么东西。拿我们比较熟悉的DataSource来说。我们进入DataSourceAutoConfiguration。

    圈出来的是比较重要的注解
    Configuration:用来告诉容器这是一个配置类,需要加载
    ConditionalOnClass:这个是自动配置里的又一个关键注解。这个注解的含义是进行条件判断。如果包含其中的类,才可以正常加载,如果不存在该类,则不加载。
    EnableConfigurationProperties:开启注解ConfigurationProperties。这个注解,将其中的类,与当前的类,进行绑定,也就是说当前类可以读取绑定类的配置。我们点进去看一下。

    @ConfigurationProperties(prefix = "spring.datasource")代表我们在 application.yml或properties中对他进行配置的前缀。下面的属性就是该类的配置的key。了解了这一层之后,我们想配东西的时候,但是不知道配什么的时候,直接按照此思路来看即可。
    当我们的条件注解都判定成功之后,该配置类里面的配置就会生效。有的配置类里面会有@bean注解,这种直接将实体放入了容器中,实现了自动配置。
    至此自动配置原理结束。

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/jichi/p/11357610.html
Copyright © 2011-2022 走看看