当我们在写代码过程中,发现一个包里的代码内容可以在多个方面使用,也许我们会选择cv大法,但是这样的做法不利于后期维护,如果想要修改一个细节的功能,就得把每一个粘贴的地方都做一个修改,于是乎我们可以自定义starter,任何项目导入此starter都会具有里面的功能,如若需要修改参数内容,只需在配置文件中修改即可..
步骤:
- 创建自定义starter项目,引入spring-boot-starter基础依赖
- 编写模块功能,引入模块所需要的依赖
- 编写XxxAutoConfiguration自动配置类,帮其他项目导入这个模块所需要的所有组件
- 编写配置文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 指定启动需要加载的自动配置
- 其他项目直接引入即可使用
1.业务代码
如果想要自定义配置有代码提示,我们导入一下依赖即可
@ConfigurationProperties(prefix = "robot") //此属性类和配置文件指定前缀绑定
@Component
@Data
public class RobotProperties {private String name;
private String age;
private String email;
}
<!-- 导入配置处理器,配置文件自定义的properties配置都会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.基本抽取
- 创建starter项目,把公共代码所需要的所有依赖导入
- 把公共代码复制进来
- 自己写一个配置类,用@Import导入这个场景所需要的组件(xxxController.class,xxxService.class)
- 解释上面:因为我们写的starter项目所在的包和引入这个starter的项目所在的包不是父子层级,所以不会扫描到我们写的starter项目的组件,所以需要@Import引入
- 所以只要导了我们写的配置类,就能把这个场景的组件导入进来
3.使用@EnableXxx机制
- 自定义一个@EnableXxx
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import(RobotAutoConfiguration.class)
public @interface EnableRobot {
}
2.在@EnableXxx上添加@Import(Xxx.class)
这样就能像@EnableWebMvc一样来启用
4.终极抽取[完全自动]-->项目启动,自动加载
- 依赖SpringBoot的SPI机制
- META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中编写好我们自动配置类的全类名即可(我们自己在starter项目中创建这些包和编写全类名)
- 项目启动,自动加载我们的自动配置类