了解完自动装配的原理,接下来就可以动手写一个自己的 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
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
- 新建一个序列化类 JsonSerial 类来实现 fastjson 序列化。
```xml
public class JsonSerial {
public <T> String serial(T t){
return JSONObject.toJSONString(t);
}
}
新建一个自动装配类 MyAutoConfiguration 来生成 JsonSerial。
@Configuration
public class MyAutoConfiguration {
@Bean
public JsonSerial jsonSerial(){
return new JsonSerial();
}
}
完成之后将其打成一个 jar 包,然后再另一个 SpringBoot 中引入依赖:
<dependency>
<groupId>com.lonely.wolf.note</groupId>
<artifactId>lonelyWolf-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
这时候在这个 SpringBoot 应用中直接注入 JsonSerial 对象会直接提示找不到这个对象:
这是因为 MyAutoConfiguration 这个类是在外部 jar 包之中,并没有被扫描到(需要注意的是,假如刚好 jar 包的路径和扫描的路径相同,那么是可以被扫描到的,但是在实际项目中,我们不可能确保引入的 jar 包能被扫描到,所以才需要通过配置的方式来导入),所以我们还需要导入这个外部配置类。
- 在 resources 目录下新建一个文件 META-INF/spring.factories 文件,文件内新增一个如下配置:
这样,SpringBoot 就会将 MyAutoConfiguration 进行管理,从而得到 JsonSerial 对象,这样就可以直接注入使用了。org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lonely.wolf.note.MyAutoConfiguration
总结
本文从为什么要有 SpringBoot,以及 SpringBoot 到底方便在哪里开始入手,逐步分析了 SpringBoot 自动装配的原理,最后手写了一个简单的 start 组件,通过实战来体会了 SpringBoot 自动装配机制的奥妙。