Spring boot系列5 - 自动化配置

自动化配置是Spring boot的核心功能之一,正是它消除或者说减少了我们在开发spring应用时所需要的一大堆和业务无关的配置。
而它背后的理念并不新鲜,它使用的是叫做约定优于配置(convention over configuration)的原则,它预先做出一些合理的假设(也就是约定),只要你遵循它的约定,就不需要做出额外的配置,便可以直接使用它提供的功能,从而消除了显式的配置。例如maven会假设源代码目录默认就是项目根目录下的src/main/java目录,如果你遵循这个目录结构,便不需要告诉maven源代码目录是什么。这个原则经常被各种框架使用,因为框架往往根据这些约定做出了相应的配置,如果这些配置符合我们的需求,我们就什么也不用做,只需要欣然的接受并使用就可以了,只有当这些配置不符合我们的需求时,才需要我们做出调整。
下面我们来看下spring boot的自动化配置。主要从以下几个方面讲述:

  • 自动化配置的目的
  • 自动化配置的实现方式
  • 启用自动化配置
  • 查看自动化配置
  • 修改自动化配置

自动配置的目的

spring boot自动配置正是应用了上面说的约定优于配置的原则,它通过检测某些条件是否满足来预先配置一些我们需要的bean对象,从而把我们从繁重的配置工作中解放出来。所以自动配置的目的就是要消除或者减少应用开发过程中和业务无关的配置。

自动配置的实现方式

自动配置本质上是通过检测一些条件来决定是否做出相应的配置,条件本身是作用在某些对象上的,这些对象包括:

  • 类路径中的jar包
  • 项目中的bean配置
  • 项目中的属性配置
    条件是通过被@Conditional修饰的注解来表述的,主要包括如下的注解:
    @ConditionalOnClass @ConditionalOnMissingClass
    @ConditionalOnBean @ConditionalOnMissingBean
    @ConditionalOnProperty
    @ConditionalOnWebApplication @ConditionalOnNotWebApplication
    从这些名字便可以看出这些条件主要是关于class、bean、property和应用类型的。实际上,spring boot正是根据类路径或应用中是否存在指定的类、是否已经配置了指定的bean、是否配置了指定的属性、应用类型等信息来决定是否需要做出相应的配置。spring boot在进行自动配置前,首先会检查应用程序和类路径中的jar包,然后再确定执行哪些自动配置。
    在这里插入图片描述
    具体的配置代码则是通过各种AutoConfiguration类来实现的,这些类在spring-boot-autoconfigure jar包中,命名方式为XXXXAutoConfiguration,例如DispatcherServletAutoConfiguration、DataSourceAutoConfiguration等。下面是一部分代码:
    在这里插入图片描述

除了spring-boot-autoconfigure包中的自动配置类外,其他的starter包中也可能会包含自己的自动配置类。

启用自动化配置

只要我们在应用中的某个类(通常是入口类)上面加上@SpringBootApplication注解便启用了自动化配置,因为它包含了@EnableAutoConfiguration注解。当然也可以单独指定
@EnableAutoConfiguration注解来启用自动化配置。

查看自动化配置

既然spring boot的自动化配置如此智能,我们大可以任其行事而不闻不问,但是无论是受到好奇心的驱使还是实际的需要,我们都想对它配置了什么
一探究竟。假如有这种需要,我们可以通过多种方式去寻找其中的蛛丝马迹。主要包括:

  • 开启debug日志
  • 查看jar包中的源代码
  • 查看spring boot文档
开启debug日志

打开hello应用中自动生成的application.properties文件,加入如下的配置:

debug=true

这样我们就打开了spring boot的debug日志,然后重新启动程序,便可以看到类似如下的信息:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
从这儿就可以看到spring boot运行了哪些自动配置类,以及相应的条件;没有运行哪些自动配置类以及哪些条件没有得到满足;还有无条件运行的配置类。

查看jar包中的源代码

前面说过spring boot的自动配置类都在spring-boot-autoconfigure jar包中,因此我们可以通过查看这个包中的源代码去了解自动配置类的信息,这些类基本上
都是以AutoConfiguration结尾的,在这个包中的META-INF目录中还包含了一个spring.factories文件,其中指定了所有的自动配置类的信息,如下所示:
在这里插入图片描述
我们可以找到需要了解的自动配置类,通过阅读它的源代码了解具体的信息。

查看spring boot文档

Spring boot文档也包含了很多的自动配置方面的信息,例如在文档的附录信息中就包含了专门的关于自动配置类的信息:
在这里插入图片描述

修改自动化配置

我们都期望生活在一个完美的世界中,尽管这种期望带来的总是失望。spring boot的自动化配置也并不完美,它有时候会智能的过了头,偏离了我们的需求,
于是我们得拿起自己的武器,毫不犹豫的征服它。我们需要对自动化配置的bean进行修改的情况大体可以分为以下几种:

  • 我们确实需要它配置的bean,但是需要对bean的某些属性进行修改
  • 我们需要配置自己的bean,从而替代它配置的bean
  • 我们完全不需要它配置的bean,也不想自己配置
我们确实需要它配置的bean,但是需要对bean的某些属性进行修改

虽然大多数时候我们都需要spring boot配置的bean对象,但是它配置的属性都是自认为合理的默认值,而我们可能需要对这些默认值进行修改,从而满足我们
的需求,这可以通过修改各种属性值来达到目的。例如,我们可能想要修改Tomcat服务器的监听端口,因为其他的应用占用了8080,我们可以通过修改如下
属性实现(在application.properties里面增加下面的内容):

server.port=8888

那么我们怎么知道有哪些可以修改的属性呢,其实有很多种方式,包括:

  • 查看spring boot参考文档
  • 查看源代码
查看spring boot参考文档

spring boot参考文档中列举了所有可以配置的属性,在附录的Application Properties部分。
在这里插入图片描述

点击进去之后便可以看到琳琅满目的属性列表:
在这里插入图片描述

查看源代码

spring boot中可以配置的属性大部分都有对应的属性类来接收属性值,这些类都在spring-boot-autoconfiguration jar包中,这些类的命名也是有规律的,基本上是XXXPropeties, 例如JdbcProperties,而且他们上面都有个@ConfigurationProperties注解,通过这个类所在的包以及对应的前缀可以大致了解其配置方面的信息。
例如要查看DataSource相关的配置,可以先找到jdbc包,然后找到DataSourceProperties类,再通过这个类的属性了解配置信息。圈红的部分是一些有用的线索。

我们需要配置自己的bean,从而替代它配置的bean

我们知道spring boot配置bean对象主要是通过检查指定的条件是否满足来确定的,只要我们能够破坏它需要的条件便可以禁止它创建相应的bean对象,而使用我们
自己配置的bean对象。例如DataSource对象的上面指定了当应用中没有配置DataSource对象和其他一些条件满足时才会创建。如果我们想配置自己
的DataSource对象,只需要配置自己DataSource类型的bean就可以了。一旦spring boot发现我们已经配置了DataSource类的对象,它便不会再创建。
在这里插入图片描述
在这里插入图片描述

我们完全不需要它配置的bean,也不想自己配置

此时,我们可以排除掉spring boot的自动配置类,从而禁止它运行指定的自动配置类。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值