了解完自动装配的原理,接下来就可以动手写一个自己的 starter 组件了。

starter 组件命名规则

SpringBoot 官方的建议是,如果是我们开发者自己开发的 starter 组件(即属于第三方组件),那么命名规范是 {name}-spring-boot-starter,而如果是 SpringBoot 官方自己开发的组件,则命名为 spring-boot-starter-{name}`。
当然,这只是一个建议,如果非不按这个规则也没什么问题,但是为了更好的识别区分,还是建议按照这个规则来命名。

手写 starter

写一个非常简单的组件,这个组件只做一件事,那就是实现 fastjson 序列化。

  • 新建一个 SpringBoot 应用 lonelyWolf-spring-boot-starter。
  • 修改 pom 文件,并新增 fastjson 依赖(省略了部分属性)。 ```xml org.springframework.boot spring-boot-starter-parent 2.4.0

com.lonely.wolf.note

lonelyWolf-spring-boot-starter

1.0.0-SNAPSHOT

org.springframework.boot spring-boot-starter

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.72</version>
  5. </dependency>

  1. - 新建一个序列化类 JsonSerial 类来实现 fastjson 序列化。
  2. ```xml
  3. public class JsonSerial {
  4. public <T> String serial(T t){
  5. return JSONObject.toJSONString(t);
  6. }
  7. }
  • 新建一个自动装配类 MyAutoConfiguration 来生成 JsonSerial。

    1. @Configuration
    2. public class MyAutoConfiguration {
    3. @Bean
    4. public JsonSerial jsonSerial(){
    5. return new JsonSerial();
    6. }
    7. }
  • 完成之后将其打成一个 jar 包,然后再另一个 SpringBoot 中引入依赖:

    1. <dependency>
    2. <groupId>com.lonely.wolf.note</groupId>
    3. <artifactId>lonelyWolf-spring-boot-starter</artifactId>
    4. <version>1.0.0-SNAPSHOT</version>
    5. </dependency>
  • 这时候在这个 SpringBoot 应用中直接注入 JsonSerial 对象会直接提示找不到这个对象:

手写一个 stater 组件 - 图1
这是因为 MyAutoConfiguration 这个类是在外部 jar 包之中,并没有被扫描到(需要注意的是,假如刚好 jar 包的路径和扫描的路径相同,那么是可以被扫描到的,但是在实际项目中,我们不可能确保引入的 jar 包能被扫描到,所以才需要通过配置的方式来导入),所以我们还需要导入这个外部配置类。

  • 在 resources 目录下新建一个文件 META-INF/spring.factories 文件,文件内新增一个如下配置:
    1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    2. com.lonely.wolf.note.MyAutoConfiguration
    这样,SpringBoot 就会将 MyAutoConfiguration 进行管理,从而得到 JsonSerial 对象,这样就可以直接注入使用了。

    总结

    本文从为什么要有 SpringBoot,以及 SpringBoot 到底方便在哪里开始入手,逐步分析了 SpringBoot 自动装配的原理,最后手写了一个简单的 start 组件,通过实战来体会了 SpringBoot 自动装配机制的奥妙。