zoukankan      html  css  js  c++  java
  • 这样讲SpringBoot自动配置原理原理,简单易懂

    前言

    学过SpringBoot 的小伙伴们都知道,当我们使用IDEA工具创建SpringBoot 项目的时候,在项目中会生成一个全局的配置文件application.properties application.yml,我们各种属性设置都在这个文件中去配置,比如:应用名称(spring.application.name)

    端口号(server.port)等等一系列的配置,那们当我们启动SpringBoot 项目这些配置就都生效了,那是这么做到的呢?接下来我们来唠唠SpringBoot 的自动配置原理。

    1、SpringBoot 自动配置原理

    @SpringBootApplication 注解

    @SpringBootApplication 标注在某个类上说明:

    • 这个类是 SpringBoot 的主配置类。
    • SpringBoot 通过运行这个类的 main 方法来启动 SpringBoot 应用。

    该注解定义如下:

    可以看到 SpringBootApplication注解是一个组合注解,主要是由元注解(@Target,@Retention,@Documented,@Inherited)和三个注解:

    • @SpringBootConfiguration:该注解表示这是一个 SpringBoot 的配置类。
    • @ComponentScan:开启组件扫描。
    • @EnableAutoConfiguration:翻译过来的意思是开启自动配置,重点就在这个配置当中。

    @EnableAutoConfiguration 注解

    该注解定义如下:

    @AutoConfigurationPackage ,在从SpringBoot源码分析 主程序配置类加载过程中讲到了,不明白的小伙吧可以看这个。

    @Import({AutoConfigurationImportSelector.class}),该注解给当前配置类导入自动配置类,其导入的AutoConfigurationImportSelector类中的selectImports()方法,通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包,然后返回需要导入的组件的全类名。

    META-INF/spring.factories

    我们来看一下 META-INF/spring.factories这类文件,这个文件是以Map 形式存放的。key是EnableAutoConfiguration类的全类名,

    value是一个xxxxAutoConfiguration的类名的列表。可以看到 EnableAutoConfiguration 下面有很多类,这些就是我们项目启动时进行自动配置的类。

    总结就是将类路径下 META-INF/spring.factories里面配置的所有 EnableAutoConfiguration 的值加入到 Spring 容器中。

    下面我么就以HttpEncodingAutoConfiguration(Http编码自动配置)为例说明自动配置原理;

    该注解如下:

    • @Configuration:表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件。
    • @ConditionalOnWebApplication:Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效。
    • @ConditionalOnClass:判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器。
    • @ConditionalOnProperty:判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的
      即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的。
    • @EnableConfigurationProperties({ServerProperties.class}):将配置文件中对应的值和 ServerProperties绑定起来;并把 ServerProperties加入到 IOC 容器中。

    ServerProperties

    ServerProperties通过 @ConfigurationProperties 注解将配置文件与自身属性绑定。

    对于@ConfigurationProperties注解小伙伴们应该知道吧,我们如何获取全局配置文件的属性中用到,它的作用就是把全局配置文件中的值绑定到实体类JavaBean上面(将配置文件中的值与ServerProperites绑定起来),而@EnableConfigurationProperties主要是把以绑定值JavaBean加入到spring容器中。

    到这里,小伙伴们应该明白,

    我们在application.properties 声明spring.application.name 是通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上,然后再通过@EnableConfigurationProperties注解导入到Spring容器中.

    AutoConfiguration:表示自动配置类

    Properties:表示封装配置文件中相关属性

    2、小结:

    Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,通过@ConfigurationProperties注解把全局配置文件中的值绑定到实体类JavaBean上面,再通过@EnableConfigurationProperties注解把绑定的JavaBean 注入到Spring容器当中。

    由于本人能力有限,若文章有错误的地方,请大家指出,一起交流学习。今天就和大家讲到这里,喜欢我的小伙伴们,动动你的小手点个关注呗。

    欢迎大家关注我的公众号:阿福聊编程,长期更新Java各种技术文章。

  • 相关阅读:
    python
    springboot-mybatis-pagehelper(分页插件)
    图片验证码工具类
    http工具类
    page工具类
    生成count位随机数工具类
    日期工具类
    dozer工具类
    list自定义排序工具类
    fastJson工具类
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/13047668.html
Copyright © 2011-2022 走看看