springBoot之starter原理

在解析原理之前,我们不妨先来尝试下如何自己制作一个属于自己的简易starter

(本文假设你是有一定经验的开发者)


springBoot之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的文件,

效果如下:


springBoot之starter原理


重点来了:

在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,那么这个文件名以及路径是从何而来的?我们来看看源码:

如图所示,该类是一个配置加载器,作用如下:

  1. 加载spring.factories
  2. 保存所加载的配置
springBoot之starter原理

SpringFactoriesLoader

EnableAutoConfiguration

解决了spring.factories文件出处的疑惑,下面来解决EnableAutoConfiguration疑点.

EnableAutoConfiguration本质是一个注解.

我们移步该注解的出处,如图

springBoot之starter原理

AutoConfigurationImportSelector

根据指定的class对象以及类加载从上述SpringFactoriesLoader中获取对应的字符串集合.

从字面上的意为返回自动配置的类名.

我们再来细看一看红色部分,这是定义EnableAutoConfiguration的出处:


springBoot之starter原理

EnableAutoConfiguration出处


BeanDefinitionRegistryPostProcessor后置处理器

我们已经知晓配置文件及内容的出处,接下来揭晓执行的时机.

首先,我们来了解下BeanDefinitionRegistryPostProcessor接口,它继承了BeanFactoryPostProcessor接口.

捋一捋BeanFactoryPostProcessor接口含义:

这是一个BeanFactory后置处理器,不同于BeanPostProcessor bean的后置处理器,这是对BeanFactory进行增加,增强的时机在于构建beanFactory完毕后(此时还未有BeanDefinition).

这是我们的重点吗?当然不是,此处只是提一下,我们关注的是BeanFactoryPostProcessor接口方法postProcessBeanDefinitionRegistry,这个才是执行自动注入逻辑的入口,如图(直接上debugger堆栈截图,我是不是太懒了???):

springBoot之starter原理


至此结束!game over!

总结

starter原理其实不难,主要抓住这几个点:

1. BeanFactoryPostProcessor后置处理器及其子类BeanDefinitionRegistryPostProcessor

  1. spring.factories文件

(以上属个人理解,不到位请指定,谢谢!)

路漫漫其修远兮,吾将上下而求索!我们要走的路还长!


分享到:


相關文章: