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