自定义一个 Spring Boot Starter -笔记
SpringBoot Starter的介绍参考: Spring Boot Starter简介-笔记-CSDN博客。这里介绍如何自定义一个springBoot Starter。
1. 项目结构
创建一个 Maven 项目,结构如下:
custom-spring-boot-starter-demo/
├── custom-hello-jdk/ # jdk模块,包含功能逻辑
├── custom-hello-spring-boot-starter-jdk/ #Starter模块
2. 项目代码
2.1 custom-hello-jdk模块
step1. pom.xml
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>custom-hello-jdk</artifactId><version>1.0.0</version><dependencies><!-- Spring Boot 自动配置依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency></dependencies>
</project>
step2. 定义功能接口和实现类
package com.example.demo;public interface HelloService {String sayHello();
}//----------------------------------------------------package com.example.demo;import org.springframework.stereotype.Service;@Service
public class DefaultHelloService implements HelloService {private final String message;public DefaultHelloService(String message) {this.message = message;}@Overridepublic String sayHello() {return message;}
}
step3. 配置属性类
package com.example.demo;import org.springframework.boot.context.properties.ConfigurationProperties;@Data
@ConfigurationProperties(prefix = "custom.hello")
public class HelloProperties {private String message = "Hello from Custom Starter!";
}
step4. 自动配置类
package com.example.demo;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloAutoConfiguration {private final HelloProperties helloProperties;public HelloAutoConfiguration(HelloProperties helloProperties) {this.helloProperties = helloProperties;}@Bean@ConditionalOnMissingBean(HelloService.class)public HelloService helloService() {return new DefaultHelloService(helloProperties.getMessage());}
}
2.2 custom-hello-spring-boot-starter-jdk模块
step1.pom.xml添加对
custom-hello-jdk的依赖
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>custom-hello-spring-boot-starter-jdk</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencies><!-- 引入自动配置模块 --><dependency><groupId>com.example</groupId><artifactId>custom-hello-jdk</artifactId><version>1.0.0</version></dependency></dependencies>
</project>
step2.注册自动配置
在 src/main/resources/META-INF/spring.factories
中添加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.HelloAutoConfiguration
备注:自动配置注册也可以放到custom-hello-jdk模块里,在starter里仅放pom文件,作为依赖聚合,方便用户引入。
step3.构建和发布
- 执行
mvn clean install
将 Starter 安装到本地 Maven 仓库 - 或通过
mvn deploy
发布到远程仓库
2.3 使用自定义 Starter
背景:在另外一个项目中使用自定义的Starter。
step1. 在另一个 Spring Boot 项目中引入依赖
<dependency><groupId>com.example</groupId><artifactId>custom-hello-spring-boot-starter-jdk</artifactId><version>1.0.0</version>
</dependency>
step2. 配置属性(可选)
custom.hello.message=Hello from Config!
step3.使用Bean
import com.example.demo.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@Autowiredprivate HelloService helloService;@GetMapping("/hello")public String hello() {return helloService.sayHello();}
}
2.4 总结
上述自定义springBoot Starter的完整流程说明:
- jdk功能模块:包含实际功能代码、配置属性等
- Starter 模块:作为依赖聚合,方便用户引入
- 条件化配置:通过
@ConditionalOnMissingBean
避免重复 Bean - 属性绑定:使用
@ConfigurationProperties
实现灵活配置