自定义一个springboot starter

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

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文件中引入以下依赖
    1. <dependencies>
    2.         <dependency>
    3.             <groupId>org.springframework.boot</groupId>
    4.             <artifactId>spring-boot-starter-web</artifactId>
    5.         </dependency>
    6.         <dependency>
    7.             <groupId>com.aliyun.oss</groupId>
    8.             <artifactId>aliyun-sdk-oss</artifactId>
    9.             <version>3.15.1</version>
    10.         </dependency>
    11.         <dependency>
    12.             <groupId>javax.xml.bind</groupId>
    13.             <artifactId>jaxb-api</artifactId>
    14.             <version>2.3.1</version>
    15.         </dependency>
    16.         <dependency>
    17.             <groupId>javax.activation</groupId>
    18.             <artifactId>activation</artifactId>
    19.             <version>1.1.1</version>
    20.         </dependency>
    21.         
    22.         <dependency>
    23.             <groupId>org.glassfish.jaxb</groupId>
    24.             <artifactId>jaxb-runtime</artifactId>
    25.             <version>2.3.3</version>
    26.         </dependency>
    27.         <dependency>
    28.             <groupId>org.springframework.boot</groupId>
    29.             <artifactId>spring-boot-configuration-processor</artifactId>
    30.             <optional>true</optional>
    31.         </dependency>
    32. </dependencies>
    复制代码
  • 在aliyun-oss-spring-boot-autoconfigure的java里面的对应的包里新建三个文件
    AliOSSProperties.java
    1. package com.minqiliang;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. @ConfigurationProperties("aliyun.oss")
    4. public class AliOSSProperties {
    5.     private String endpoint;
    6.     private String accessKeyId;
    7.     private String accessKeySecret;
    8.     private String bucketName;
    9.     /**
    10.      * 获取
    11.      * @return endpoint
    12.      */
    13.     public String getEndpoint() {
    14.         return endpoint;
    15.     }
    16.     /**
    17.      * 设置
    18.      * @param endpoint
    19.      */
    20.     public void setEndpoint(String endpoint) {
    21.         this.endpoint = endpoint;
    22.     }
    23.     /**
    24.      * 获取
    25.      * @return accessKeyId
    26.      */
    27.     public String getAccessKeyId() {
    28.         return accessKeyId;
    29.     }
    30.     /**
    31.      * 设置
    32.      * @param accessKeyId
    33.      */
    34.     public void setAccessKeyId(String accessKeyId) {
    35.         this.accessKeyId = accessKeyId;
    36.     }
    37.     /**
    38.      * 获取
    39.      * @return accessKeySecret
    40.      */
    41.     public String getAccessKeySecret() {
    42.         return accessKeySecret;
    43.     }
    44.     /**
    45.      * 设置
    46.      * @param accessKeySecret
    47.      */
    48.     public void setAccessKeySecret(String accessKeySecret) {
    49.         this.accessKeySecret = accessKeySecret;
    50.     }
    51.     /**
    52.      * 获取
    53.      * @return bucketName
    54.      */
    55.     public String getBucketName() {
    56.         return bucketName;
    57.     }
    58.     /**
    59.      * 设置
    60.      * @param bucketName
    61.      */
    62.     public void setBucketName(String bucketName) {
    63.         this.bucketName = bucketName;
    64.     }
    65. }
    复制代码
    AliOSSUtils.java
    1. package com.minqiliang;
    2. import com.aliyun.oss.OSS;
    3. import com.aliyun.oss.OSSClientBuilder;
    4. import org.springframework.web.multipart.MultipartFile;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.util.UUID;
    8. /**
    9. * 阿里云 OSS 工具类
    10. */
    11. public class AliOSSUtils {
    12.     private AliOSSProperties aliOSSProperties;
    13.     public AliOSSProperties getAliOSSProperties() {
    14.         return aliOSSProperties;
    15.     }
    16.     public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
    17.         this.aliOSSProperties = aliOSSProperties;
    18.     }
    19.     /**
    20.      * 实现上传图片到OSS
    21.      */
    22.     public String upload(MultipartFile file) throws IOException {
    23.         String endpoint = aliOSSProperties.getEndpoint();
    24.         String accessKeyId = aliOSSProperties.getAccessKeyId();
    25.         String accessKeySecret = aliOSSProperties.getAccessKeySecret();
    26.         String bucketName = aliOSSProperties.getBucketName();
    27.         // 获取上传的文件的输入流
    28.         InputStream inputStream = file.getInputStream();
    29.         // 避免文件覆盖
    30.         String originalFilename = file.getOriginalFilename();
    31.         String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
    32.         //上传文件到 OSS
    33.         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    34.         ossClient.putObject(bucketName, fileName, inputStream);
    35.         //文件访问路径
    36.         String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
    37.         // 关闭ossClient
    38.         ossClient.shutdown();
    39.         return url;// 把上传到oss的路径返回
    40.     }
    41. }
    复制代码
    AliyunOssAutoConfigration.java
    1. package com.minqiliang;
    2. import org.springframework.boot.context.properties.EnableConfigurationProperties;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. @Configuration
    6. @EnableConfigurationProperties(AliOSSProperties.class)
    7. public class AliyunOssAutoConfigration {
    8.     @Bean
    9.     public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
    10.         AliOSSUtils aliossUtils = new AliOSSUtils();
    11.         aliossUtils.setAliOSSProperties(aliOSSProperties);
    12.         return  aliossUtils;
    13.     }
    14. }
    复制代码
  • aliyun-oss-spring-boot-autoconfigure的resources文件加下新建META_INF/spring文件夹,然后再在spring文件夹里新建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件内容为AliyunOssAutoConfigration类的全类名,如下
    1. com.minqiliang.AliyunOssAutoConfigration
    复制代码
  • 在aliyun-oss-spring-boot-starter的pom文件里引入aliyun-oss-spring-boot-autoconfigure依赖
    1. <dependencies>
    2.         <dependency>
    3.             <groupId>org.springframework.boot</groupId>
    4.             <artifactId>spring-boot-starter</artifactId>
    5.         </dependency>
    6.         <dependency>
    7.             <groupId>com.minqiliang</groupId>
    8.             <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
    9.             <version>0.0.1-SNAPSHOT</version>
    10.         </dependency>
    11. </dependencies>
    复制代码
  • 目录结构如下

  • 执行clean和install,把自定义的starter安装到本地仓库
  • 新建一个aliyun-starter-test模块,进行测试,目录结构如下:

  • UploadController.java
    1. package com.example.controller;
    2. import com.example.pojo.Result;
    3. import com.minqiliang.AliOSSUtils;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.web.bind.annotation.PostMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import org.springframework.web.multipart.MultipartFile;
    8. import java.io.IOException;
    9. @RestController
    10. public class UploadController {
    11.     @Autowired
    12.     private AliOSSUtils aliOSSUtils;
    13.     @PostMapping("upload")
    14.     public Result upload(MultipartFile image) throws IOException {
    15.         String url = aliOSSUtils.upload(image);
    16.         return Result.success(url);
    17.     }
    18. }
    复制代码
    Result.java
    1. package com.example.pojo;
    2. public class Result {
    3.     private Integer code;//响应码,1 代表成功; 0 代表失败
    4.     private String msg;  //响应信息 描述字符串
    5.     private Object data; //返回的数据
    6.     public Result() {
    7.     }
    8.     public Result(Integer code, String msg, Object data) {
    9.         this.code = code;
    10.         this.msg = msg;
    11.         this.data = data;
    12.     }
    13.     //增删改 成功响应
    14.     public static Result success(){
    15.         return new Result(1,"success",null);
    16.     }
    17.     //查询 成功响应
    18.     public static Result success(Object data){
    19.         return new Result(1,"success",data);
    20.     }
    21.     //失败响应
    22.     public static Result error(String msg){
    23.         return new Result(0,msg,null);
    24.     }
    25.     /**
    26.      * 获取
    27.      * @return code
    28.      */
    29.     public Integer getCode() {
    30.         return code;
    31.     }
    32.     /**
    33.      * 设置
    34.      * @param code
    35.      */
    36.     public void setCode(Integer code) {
    37.         this.code = code;
    38.     }
    39.     /**
    40.      * 获取
    41.      * @return msg
    42.      */
    43.     public String getMsg() {
    44.         return msg;
    45.     }
    46.     /**
    47.      * 设置
    48.      * @param msg
    49.      */
    50.     public void setMsg(String msg) {
    51.         this.msg = msg;
    52.     }
    53.     /**
    54.      * 获取
    55.      * @return data
    56.      */
    57.     public Object getData() {
    58.         return data;
    59.     }
    60.     /**
    61.      * 设置
    62.      * @param data
    63.      */
    64.     public void setData(Object data) {
    65.         this.data = data;
    66.     }
    67.     public String toString() {
    68.         return "Result{code = " + code + ", msg = " + msg + ", data = " + data + "}";
    69.     }
    70. }
    复制代码
  • pom文件引入aliyun-oss-spring-boot-starter依赖
    1. <dependencies>
    2.         <dependency>
    3.             <groupId>org.springframework.boot</groupId>
    4.             <artifactId>spring-boot-starter-web</artifactId>
    5.         </dependency>
    6.         <dependency>
    7.             <groupId>org.springframework.boot</groupId>
    8.             <artifactId>spring-boot-starter-test</artifactId>
    9.             <scope>test</scope>
    10.         </dependency>
    11.         <dependency>
    12.             <groupId>com.minqiliang</groupId>
    13.             <artifactId>aliyun-oss-spring-boot-starter</artifactId>
    14.             <version>0.0.1-SNAPSHOT</version>
    15.         </dependency>
    16. </dependencies>
    复制代码
  • application.yml里配置自己的阿里云oss信息,如下
    1. aliyun:
    2.   oss:
    3.     endpoint: 填写自己的
    4.     accessKeyId: 填写自己的
    5.     accessKeySecret: 填写自己的
    6.     bucketName: 填写自己的
    复制代码
  • 启动测试项目,使用postman上传一个文件,结果如下,说明starter配置成功
    1. {
    2.     "code": 1,
    3.     "msg": "success",
    4.     "data": "https://tlias-manage.oss-cn-hangzhou.aliyuncs.com/8713ed3d-751c-4d54-8a64-239b1ccb0da4.jpg"
    5. }
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表