SpringBoot中如何创建一个自定义的starter
在springboot中,我们经常可以看到一些如xxx-starter-xxx的maven坐标,典型是spring-boot-starter-web。SpringBoot可以实现将常用的场景抽取成了一个个starter(场景启动器),使用者通过引入springboot提供的这些启动器,搭配少量的配置就能实现相应的功能。
在公司的内部往往会有一些封装的中间件,这些封装的中间件需要被其他项目依赖,其他的项目直接引入starter便可以实现自动化配置。下面我们来聊聊如何自定义一个starter。
1、自定义starter
需求描述:通过自定义的starter,实现每个项目中配置不同的参数值,并且读取这个配置的值。
项目的工程的结构如下所示:
(1)在自定义starter模块中添加必要依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(2)自定义读取配置的配置类
@Component
@ConfigurationProperties("com.longxia")
@Data
public class MytConfigProperty {
private String name;
private Integer age;
}
(3)定义service
public class MyService {
private MyConfigProperty myConfigProperty;
public MyFirstService() {
}
public MyService(MytConfigProperty myConfigProperty) {
this.myConfigProperty = myConfigProperty;
}
public String say(){
return "myStarter " + myConfigProperty.getName() + " !";
}
}
(4)添加service的配置
@Configuration
//开启配置文件的数据注入
@EnableConfigurationProperties({MytConfigProperty.class})
public class MyConfig {
@Resource
private MyConfigProperty myConfigProperty;
@Bean
public MyFirstService getMyFirstService(){
return new MyFirstService(myFirstConfigProperty);
}
}
(5)编写spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.longxia.spring.starter.config.MyConfig
spring.factories的目的是让我们配置的starter可以被其他项目的在启动的时候扫描到。
2、使用自定义的starter
(1)添加自定义的starter的依赖
<dependency>
<groupId>com.longxia.cloud</groupId>
<artifactId>common-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2)在使用者中添加配置文件属性值
(3)定义controller,测试效果
@RestController
@RequestMapping("/starter")
public class MyFirstStarterController {
@Resource
private MytService myService;
@GetMapping("/first")
public String first() {
return mytService.hello();
}
}
在浏览器上输入:http://localhost:8080/starter/first
到此自定义的starter的就完成了,如果哪个业务模块中需要使用封装的common-starter,直接引入其maven依赖并且做相应的配置就可以使用了。