SpringBoot如何扩展引入的组件,以及如何自动配置原理!

java 同时被 3 个专栏收录
1 篇文章 0 订阅
1 篇文章 0 订阅
1 篇文章 0 订阅

大家都知道,当我们创建SpringBoot项目之后,我们可以在pom文件下,引入我们想要启动的组件,当我们引入之后,SpringBoot会自动帮我们配置属性!

下面我们以SpringBoot引入SpringMvc组件为例,其他组件也是相似

  1. 当我们开启SpringMvc组件之后,SpringBoot会默认帮我们吧SpringMvc配置完成,那么他是如何配置的呢?

    当我们开启SpringMvc之后,SpringBoot就会帮我们导入SpringMvc所需要的依赖,同时会有一个 WebMvcAutoConfiguration 的类,不知道大家有没有注意,我们可以翻译一下这个英文单词 “WebMvc自动配置” 见名知意,这个就是SpringBoot为SpringMvc提供的自动配置类 !

 

 

用红框所包住的,一会再说!   

 2.每一个自动配置类(xxxAutoConfiguration),都对应着 xxxProperties 类,然后我们可以看一下,WebMvcAutoConfiguration 对应的 WebMvcProperties 类

 

 

3.我们可以清晰的看到,这个是 WebMvc自动配置类所对应的Properties类,当自动配置生效时,自动配置类会去对应的Properties类中获取一些属性,从而完成自动配置!

4.我们可以看到用红框所标注区域,我们先解释一下 @ConfigurationProperties 注解的作用

    @ConfigurationProperties 作用:项目启动时,指定前缀,读取application文件中带有指定前缀的属性值,对应到当前的JavaBean属性中。

    那我们再看红框中的内容就明白了,他的意思是当项目启动时,会去 application 文件中读取以 “spring.mvc” 开头的属性值,从而获取相对应的属性值 ,对应到JavaBean属性中,这也就是我们说为什么能在 application 中配置属性的原因了,我们所配置的属性都是对应的这个JavaBean中的属性!

 

 

5.明白这个原理之后每当我们引入某个组件时,都可以查看他的AutoConfiguration类以及他对应的Properties类,就可以根据Properties类中的属性,去application文件中设置他的一些属性,从而改变一些他的行为

我们再来说说如何扩展引入的组件

下面我们还以SpringMvc举例

我们以前使用SpringMvc的时候,都会创建一个SpringMvc的配置文件,文件中可以设置视图解析器等等,当我们想要添加某个功能时直接在里面编写即可

 

如果有配置文件的话,我们可以在配置文件中配置我们想要的功能,但是现在问题来了,当我们使用SpringBoot管理项目时,他没有给我们提供SpringMvc配置文件,他只给我们加了个自动配置类,那我们应该怎样扩展呢?

下面我们以 设置资源映射 为例:

在SpringBoot中有两种扩展组件功能方式:

    一种是:全面接管配置,也就是说不交给SpringBoot管理,我们自己去管理SpringMvc(开发中不推荐使用)

    另一种是:结合SpringBoot一起接管,这个方式也就是说,我们只扩展我们需要的功能,保留SpringBoot默认对SpringMvc的配置


 我们先来说和SpringBoot一起接管如何扩展:

首先我们需要先建立一个配置类,这个配置类得继承 WebMvcConfigurerAdapter,并且标注@Configuration注解

 

 

@Configuration 表明这个类是一个配置类,如果小伙伴有对这些注解不了解的,建议观看b站中的Spring注解驱动开发

同时我们必须要继承WebMvcConfigurerAdater类,我们看一下 WebMvcConfigurerAdater 类中有哪些东西?

 

 

我们可以看到这个类中,有很多空的方法,并且这是一个抽象类,里面的方法就相当于一个SpringMvc的功能点,比如图中最后一个方法,就是添加一个拦截器,我们只需要重写一下这个方法就可以实现拦截器的功能!

当SpringBoot启动时,也会将我们所编写的配置类,扫描进去,从而和SpringBoot为SpringMvc提供的自动配置类结合,保留SpringBoot对SpringMvc的默认配置

下面我们再来说第二种:全面接管SpringMvc配置

全面接管SpringMvc配置,那么SpringBoot对SpringMvc的配置就会全部失效

 

 

和非全面接管,有一点不同就是多了个 @EnableWebMvc 注解,就是由红框标注的注解

我们可以看一下这个注解中有什么内容

 

 

我们可以看到这个注解里面什么内容都没有,但是,注意我用红框所圈住的哪一个注解,那个注解的作用是引入 DelegatingWebMvcConfiguration 组件,那我们就得思考了?为什么要引入这个类呢?我们点进去这个类看一下

 

 

我们可以看到这个这个类他是一个配置类,同时他又继承了一个 WebMvcConfigurationSupport 类,这个是重点!

我们在上面已经讲解每一个引入的组件都会有一个对应的自动配置类,那么我们刚才说的是全面接管自动配置类,也就是说不使用SpringBoot提供的WebMvcAutoConfiguration类,那么说全面接管和我们这个继承 WebMvcConfigurationSupport 类有什么关系呢?我们不妨再看一下WebMvcAutoConfiguration类

 

 

这个就是我们的SpringMvc自动配置类,OK,我们必须明白一点,那就是如果想要全面接管SpringMvc的管理,那这个自动配置类就不能生效!

大家仔细看我用红框标注的哪一行,我为大家解释一下这行什么意思:

如果这个 WebMvcConfigurationSupport 类不存在,才使用自动配置类,也就是才使用 WebMvcAutoConfiguration 类中的内容,换句话说,如果 WebMvcConfigurationSupport 类存在,那么这个自动配置类不生效

而我们的全面接管的配置类,使用了 @EnableWebMvc 注解, @EnableWebMvc 注解中又引入了 DelegatingWebMvcConfiguration 组件,而 DelegatingWebMvcConfiguration 组件又继继承了 WebMvcConfigurationSupport 并变成了配置类,所以说当 WebMvcAutoConfiguration 生效时正好检测到了 WebMvcConfigurationSupport 的存在,然后没有满足 WebMvcAutoConfiguration 自动配置生效类的条件,所以就不会使用自动配置类,而会使用我们自己所配置的配置类!

总结:

    1)、使用SpringBoot没开启一个组件,那么这个组件一定会对应一个xxxAutoConfiguration自动配置类,然后每一个 xxxAutoConfiguration自动配置类,都会对应一个xxxProperties类,当xxxAutoConfiguration自动配置类生效时,会去xxxProperties中读取某个属性使用!

    2)、如何在application中配置某个组件的属性?每一个组件都会对应一个xxxAutoConfiguration和xxxProperties,那我们只需要去xxxProperties中看到他的前缀,以及他的属性就可以完成对此组件的属性设置

    3)、非全面接管组件配置,会和SpringBoot一起去配置某个组件;

    4)、全面接管组件配置的核心:加上了@EnableWebMvc 注解, @EnableWebMvc 注解中又引入了 DelegatingWebMvcConfiguration 组件,而 DelegatingWebMvcConfiguration 组件又继承了 WebMvcConfigurationSupport 并变成了配置类,吧WebMvcConfigurationSupport加到了容器中,自动配置生效的其中一个条件是容器中不能存在WebMvcConfigurationSupport类,但是使用@EnableWebMvc注解正好吧WebMvcConfigurationSupport类加到容器中,从而导致自动配置没有生效,完成全面接管!

    6)、如果需要增加其他的组件的功能的话,和这个步骤也是相似的

 

此篇文章仅让您了解SpringBoot对组件的自动配置原理,以及如何扩展组件其他功能

如果和雷老师讲得略同,那是因为作者也是看过雷老师的视频的哦!

不喜勿喷,有些写的不好的地方或者有什么错误的地方,欢迎各位指教!

同时,欢迎各位多多转载

                                                                                         ---一个不会秃头的程序员

 

 

  • 3
    点赞
  • 1
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值