springBoot 自动配置原理
在之前文章中说过,springBoot会根据jar包去添加许多的自动配置,本文就来说说为什么会自动配置,自动配置的原理时什么?
springBoot在运行SpringApplication对象实例化时,就会去加载 META-INF/spring.factories文件,就会将这个文件中的配置都加载到spring容器中。下面,我们去看看SpringApplication对象的初始化方法 initialize() 方法。
因为我们在项目启动时有用到这个对象,所以,我们可以直接从这里进入。

找到 initialize()方法,发现,在其中存在一个获取初始化参数的方法。

我们继续向下跟进。

继续跟进,我发现里面存在两个方法,第一个获取配置中的类的名字,第二个将配置中的类创建为一个个对象。

接下来,我先跟进SpringFactoriesLoader.loadFactoryNames()方法。(笔记本屏幕显示不下,所以直接拉代码过来,就不截图了)
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
我发现上面使用到一个常量 FACTORIES_RESOURCE_LOCATION ,去找到这个常量。

这个常量存放了一个文件位置,而这个文件中存放的就是自动配置的一个个对象。去找到它们。


找到这些对象之后,继续执行createSpringFactoriesInstances()方法。将上面获取到的对象名称全部实例化为一个个对象。

在spring-boot-autoconfigure的包下,也同样有一个spring.factories文件,上面的文件中主要包含的是一些系统级的自动配置,而在spring-boot-autoconfigure包下的则是一些第三方的自动配置,比如下面的redis等等。


我们进入到redis去看看,我发现在其头部有一句注解@ConditionalOnClass,这个注解的意思是,只有系统中有这几个类时,才会去加载配置这个类,如果没有则不去加载配置。

在下面这个对象中,自动去加载redis的配置


而这些配置参数则时去 application.properties文件中去找的,这个文件中的基础配置在我之前的文章中有写过(springBoot application.properties 基础配置)。


以上就是springBoot的自动化配置的原理,当然,我们知道了这些原理,其实就可以模仿这种方式在项目中加入自定义的自动化配置。
最后附上一些条件注解,在上面的自动化配置中也经常使用到。
| 注解 | 解释 |
|---|---|
| @ConditionalOnBean | 当容器中有指定Bean的条件下 |
| @ConditionalOnClass | 当路径下有指定类的条件下 |
| @ConditionalOnExpression | 基于SqEL表达式作为判断条件 |
| @ConditionalOnJava | 基于JVM版本作为判断条件 |
| @ConditionalOnJndi | 在JNDI存在的条件下查找指定位置 |
| @ConditionalOnMissingBean | 当容器中没有指定Bean的情况下 |
| @ConditionalOnMissingClass | 当类路径下没有指定的类的条件下 |
| @ConditionalOnNotWebApplication | 当前项目不是Web项目的情况下 |
| @ConditionalOnProperty | 指定的属性是否有指定的值 |
| @ConditionalOnResource | 类路径是否有指定的值 |
| @ConditionalOnSingleCandidate | 当前指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean |
| @ConditionalOnWebApplication | 当前项目时Web项目的条件下 |
-------------------- END ---------------------
最后附上作者的微信公众号地址和博客地址
公众号:wuyouxin_gzh

Herrt灬凌夜:https://www.cnblogs.com/wuyx/
springBoot 自动配置原理的更多相关文章
- 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
https://juejin.im/post/5ce5effb6fb9a07f0b039a14 前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题 ...
- springboot自动配置原理以及手动实现配置类
springboot自动配置原理以及手动实现配置类 1.原理 spring有一个思想是"约定大于配置". 配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot ...
- SpringBoot自动配置原理
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...
- SpringBoot实战之SpringBoot自动配置原理
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...
- 3. SpringBoot ——自动配置原理浅析
SpringBoot的功能之所以强大,离不开它的自动配置这一大特色.但估计很多人只是知其然而不知其所以然.下面本人对自动配置原理做一个分析: 在使用SpringBoot时我们通过引入不同的Starte ...
- SpringBoot自动配置原理学习
介绍 构建Springboot项目时我们会创建一个启动类 @SpringBootApplication public class DemoApplication { public static voi ...
- 浅谈springboot自动配置原理
前言 springboot自动配置关键在于@SpringBootApplication注解,启动类之所以作为项目启动的入口,也是因为该注解,下面浅谈下这个注解的作用和实现原理 @SpringBootA ...
- SpringBoot系列二:SpringBoot自动配置原理
主程序类的注解 @SpringBootApplication 注解,它其实是个组合注解,源码如下: @Target({ElementType.TYPE}) @Retention(RetentionPo ...
- springBoot 自动配置原理--自己新建一个 starter
上篇我们说到 springboot 和 SSM 框架的区别,今天我们就看看 springboot 到底为我们做了哪些事情,让我们开发变得如此简单. springboot 中起着重要作用的是 start ...
随机推荐
- JS设计模式——7.工厂模式(示例-RSS阅读器)
RSS阅读器 由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中. 使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起 ...
- 排序算法的java实现
冒泡.选择就不写了.很常见 一:插入排序: /** * 插入排序 */ public class P4_3 { static void insertSort(int[] a){ int j,t; /* ...
- 使用solrJ管理索引——(十四)
a) 什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
- ubuntu16.04 eclipse+pydev 配置
参考:http://blog.csdn.net/bluish_white/article/details/56509446,http://blog.csdn.net/qing101hua/articl ...
- SQLServer数据操作(建库、建表以及数据的增删查改)[转]
SQLSever数据操作 一.建立数据库: create database DB ---数据库名称 ( name=data1 --文件名, filename ...
- sicily 1215. 脱离地牢
Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想得到这两块石头了,只要把 ...
- gitHub 迁移到gitlab上
GitHub 迁移到 GitLab 上 第一步在github上生成 token 地址 https://blog.csdn.net/u014175572/article/details/55510825 ...
- 查看sql语句加锁信息
问题: 最近使用quartz集群,总是报deadlock问题,所以需要查看一下执行的sql导致的加锁冲突. 步骤: 1.在要测试的库中创建指定表innodb_lock_monitor create t ...
- cobbler 无人值守系统安装
概述 本文适合centos6 | centos7 系统的安装 执行操作之前:检查系统防火墙,selinux是否关闭,网络链接是否畅通. Cobbler是一个免费开源系统安装部署软件,用于自动化网络安装 ...
- angular架构
angular架构包括以下部分: 1.模块 2.组件 3.模板 4.元数据 5.数据绑定 6.指令 7.服务 8.依赖注入 9.动画 10.变更检测 11.事件 12.表单 13.HTTP 14.生命 ...