自定义一个springboot starter
1.自定义starter的作用在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,比如阿里云oss存储的时候,我们需要一个工具类进行文件上传。我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,这样会非常麻烦。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要在 maven pom 中引用依赖即可,让 SpringBoot 为我们完成自动装配,提高开发效率。
2.自定义starter命名规范
SpringBoot提供的 starter 以 spring-boot-starter-xxx 的方式命名的。官方建议自定义的 starter 使用 xxx-spring-boot-starter 命名规则。以区分 SpringBoot 生态提供的 starter。如:mybatis-spring-boot-starter
3.自定义starter的步骤
现在就以自定义阿里云oss工具starter为例步骤如下:
[*]新建两个maven模块
(1)aliyun-oss-spring-boot-autoconfigure:自动配置核心代码
(2)aliyun-oss-spring-boot-starter:管理依赖
[*]在aliyun-oss-spring-boot-autoconfigure的pom文件中引入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
[*]在aliyun-oss-spring-boot-autoconfigure的java里面的对应的包里新建三个文件
AliOSSProperties.java
package com.minqiliang;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 获取
* @return endpoint
*/
public String getEndpoint() {
return endpoint;
}
/**
* 设置
* @param endpoint
*/
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
/**
* 获取
* @return accessKeyId
*/
public String getAccessKeyId() {
return accessKeyId;
}
/**
* 设置
* @param accessKeyId
*/
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
/**
* 获取
* @return accessKeySecret
*/
public String getAccessKeySecret() {
return accessKeySecret;
}
/**
* 设置
* @param accessKeySecret
*/
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
/**
* 获取
* @return bucketName
*/
public String getBucketName() {
return bucketName;
}
/**
* 设置
* @param bucketName
*/
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
}AliOSSUtils.java
package com.minqiliang;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
public class AliOSSUtils {
private AliOSSProperties aliOSSProperties;
public AliOSSProperties getAliOSSProperties() {
return aliOSSProperties;
}
public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
this.aliOSSProperties = aliOSSProperties;
}
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//") + "//" + bucketName + "." + endpoint.split("//") + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}AliyunOssAutoConfigration.java
package com.minqiliang;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliyunOssAutoConfigration {
@Bean
public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
AliOSSUtils aliossUtils = new AliOSSUtils();
aliossUtils.setAliOSSProperties(aliOSSProperties);
returnaliossUtils;
}
}
[*]aliyun-oss-spring-boot-autoconfigure的resources文件加下新建META_INF/spring文件夹,然后再在spring文件夹里新建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件内容为AliyunOssAutoConfigration类的全类名,如下
com.minqiliang.AliyunOssAutoConfigration
[*]在aliyun-oss-spring-boot-starter的pom文件里引入aliyun-oss-spring-boot-autoconfigure依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.minqiliang</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
[*]目录结构如下
https://s1.ax1x.com/2023/05/21/p9IltG8.png
[*]执行clean和install,把自定义的starter安装到本地仓库
[*]新建一个aliyun-starter-test模块,进行测试,目录结构如下:
https://s1.ax1x.com/2023/05/21/p9IlNRS.png
[*]UploadController.java
package com.example.controller;
import com.example.pojo.Result;
import com.minqiliang.AliOSSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("upload")
public Result upload(MultipartFile image) throws IOException {
String url = aliOSSUtils.upload(image);
return Result.success(url);
}
}Result.java
package com.example.pojo;
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg;//响应信息 描述字符串
private Object data; //返回的数据
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//增删改 成功响应
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
/**
* 获取
* @return code
*/
public Integer getCode() {
return code;
}
/**
* 设置
* @param code
*/
public void setCode(Integer code) {
this.code = code;
}
/**
* 获取
* @return msg
*/
public String getMsg() {
return msg;
}
/**
* 设置
* @param msg
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* 获取
* @return data
*/
public Object getData() {
return data;
}
/**
* 设置
* @param data
*/
public void setData(Object data) {
this.data = data;
}
public String toString() {
return "Result{code = " + code + ", msg = " + msg + ", data = " + data + "}";
}
}
[*]pom文件引入aliyun-oss-spring-boot-starter依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.minqiliang</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
[*]application.yml里配置自己的阿里云oss信息,如下
aliyun:
oss:
endpoint: 填写自己的
accessKeyId: 填写自己的
accessKeySecret: 填写自己的
bucketName: 填写自己的
[*]启动测试项目,使用postman上传一个文件,结果如下,说明starter配置成功
{
"code": 1,
"msg": "success",
"data": "https://tlias-manage.oss-cn-hangzhou.aliyuncs.com/8713ed3d-751c-4d54-8a64-239b1ccb0da4.jpg"
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]