Springboot(三)——自动配置类部分源码阅读

自动配置类

Spring Factories实现原理

spring.factories文件中,包含了项目需要的配置类。

spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:loadFactoryNamesloadSpringFactories

第二个方法会遍历整个ClassLoader中所有jar包下的spring.factories文件。也就是说,我们可以在自己的jar中配置spring.factories文件,不会影响到其他地方的配置,也不会被别人的配置覆盖掉。

spring.factories是通过Properties解析得到的,所以我们在写文件的内容都是按照下面这种方式配置的:

com.xxx.interface=com.xxx.classname

如果一个接口希望配置多个实现类,可以使用“,”进行分割。

在SpringBoot的很多包中都能够找到spring.factories文件。

在SpringBoot中,使用最多的就是starter。starter可以理解为一个可拔插式的插件,例如,想使用JDBC插件,那么可以使用spring-boot-starter-jdbc;如果想使用MongoDB,可以使用spring-boot-starter-data-mongodb。
starter和普通jar包的区别在于,它能够实现自动配置,和SpringBoot无缝衔接,从而大大节省开发时间。

自动配置类原理

spring-boot-autoconfigure中的spring.factories里面保存着springboot的默认提供的自动配置类。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例子:HttpEncodingAutoConfiguration

HttpEncodingAutoConfiguration是一个http编码转换的自动配置类。

HttpEncodingAutoConfiguration类上有许多配置相关的注解,其作用如下图:
在这里插入图片描述
在这里插入图片描述

条件判断

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用: 必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面所有的内容才生效:

@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定的Bean
@ConditionalOnMissingBean容器中不存在指定Bean
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项

精髓

  • SpringBoot启动会加载大量的自动配置类
  • 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
  • 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
  • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值