在解析原理之前,我们不妨先来尝试下如何自己制作一个属于自己的简易starter(本文假设你是有一定经验的开发者)
![04acf8759866465811c58ace43d1be8f.png](https://img-blog.csdnimg.cn/img_convert/04acf8759866465811c58ace43d1be8f.png)
环境准备
maven导入如下(可不用),其他略
org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
ps:官方建议命名略过
代码准备
准备一个相当简单的类,不用拘于代码;若需要进行深度扩展,请参考Import或者Configuration注解进行导入更多类.此项目我们仅仅自动注入CustomStarter类.
是的,你没看错,就是自动注入一个类,一个类,一个类...
package com.ws
public class CustomStarter {
public int add(int a, int b) {
return a + b;
}
}
配置文件准备
在resource目录下创建目录META-INF,并在META-INF下创建名为spirng.factories的文件,
效果如下:
![0e3ec5957770ab0882778c3759a440b8.png](https://img-blog.csdnimg.cn/img_convert/0e3ec5957770ab0882778c3759a440b8.png)
重点来了:
在spring.factories文件中加入如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ws.CustomStarter
此处将我们定义的类的全限定路径填上.
最后一步
使用maven命令或者idea将此项目进行打包,这样就大功告成了.
如何使用呢: 直接在springBoot项目中将打包的项目导入即可.
好了,简易的starter制作完成,重头戏来了,前面都是小打小闹,下面开始原理/源码分析
spring.factories文件
springBoot不可能平白无故自动注入定义的bean,肯定在某个地方默默地加载定义的starter.
那么应该是哪里呢?没错,就是spring.factories文件.
我们定义了一个重要的kv内容,将定义的CustomStarter赋给了EnableAutoConfiguration,那么这个文件名以及路径是从何而来的?我们来看看源码:
如图所示,该类是一个配置加载器,作用如下:
- 加载spring.factories
- 保存所加载的配置
![6ac905d060540de3bce2b1d52c549e7c.png](https://img-blog.csdnimg.cn/img_convert/6ac905d060540de3bce2b1d52c549e7c.png)
SpringFactoriesLoader
EnableAutoConfiguration
解决了spring.factories文件出处的疑惑,下面来解决EnableAutoConfiguration疑点.
EnableAutoConfiguration本质是一个注解.
我们移步该注解的出处,如图
![0ccbe7ce499a4a0a83ffa846490c28d9.png](https://img-blog.csdnimg.cn/img_convert/0ccbe7ce499a4a0a83ffa846490c28d9.png)
AutoConfigurationImportSelector
根据指定的class对象以及类加载从上述SpringFactoriesLoader中获取对应的字符串集合.
从字面上的意为返回自动配置的类名.
我们再来细看一看红色部分,这是定义EnableAutoConfiguration的出处:
![8220db12ea0aecdb6f3a5719ee992d15.png](https://img-blog.csdnimg.cn/img_convert/8220db12ea0aecdb6f3a5719ee992d15.png)
EnableAutoConfiguration出处
BeanDefinitionRegistryPostProcessor后置处理器
我们已经知晓配置文件及内容的出处,接下来揭晓执行的时机.
首先,我们来了解下BeanDefinitionRegistryPostProcessor接口,它继承了BeanFactoryPostProcessor接口.
捋一捋BeanFactoryPostProcessor接口含义:
这是一个BeanFactory后置处理器,不同于BeanPostProcessor bean的后置处理器,这是对BeanFactory进行增加,增强的时机在于构建beanFactory完毕后(此时还未有BeanDefinition).
这是我们的重点吗?当然不是,此处只是提一下,我们关注的是BeanFactoryPostProcessor接口方法postProcessBeanDefinitionRegistry,这个才是执行自动注入逻辑的入口,如图(直接上debugger堆栈截图,我是不是太懒了???):
![9b4ae58bf509abc5665c200d8c2c08f8.png](https://img-blog.csdnimg.cn/img_convert/9b4ae58bf509abc5665c200d8c2c08f8.png)
至此结束!game over!
总结
starter原理其实不难,主要抓住这几个点:
1. BeanFactoryPostProcessor后置处理器及其子类BeanDefinitionRegistryPostProcessor
- spring.factories文件
(以上属个人理解,不到位请指定,谢谢!)
路漫漫其修远兮,吾将上下而求索!我们要走的路还长!