自定义阿里云OSS上传文件的start依赖

说明:SpringBoot项目之所以开发起来很方便,是因为SpringBoot项目在启动时自动为我们装配了很多Bean对象(参考:http://t.csdn.cn/MddMO),这取决于我们是否在pom.xml文件添加对应的依赖,称为起步依赖。

我们自己也可以自定义实现一个起步依赖,让后面创建的模块,只要引用了该模块,就可以自动调用该依赖所属的Bean对象,实现对应的功能。这里我以阿里云OSS上传文件功能为例,自定义一个该功能的依赖(阿里云OSS使用参考:http://t.csdn.cn/WCDZt)。

【第一步】新建自动配置模块

创建一个oss-essay-spring-boot-autoconfigure模块,该模板内仅放完成阿里云OSS上传的所有依赖,不编写一行代码

    
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.7.12version>
        <relativePath/>
    parent>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        
        <dependency>
            <groupId>com.aliyun.ossgroupId>
            <artifactId>aliyun-sdk-ossartifactId>
            <version>3.15.1version>
        dependency>

        <dependency>
            <groupId>javax.xml.bindgroupId>
            <artifactId>jaxb-apiartifactId>
            <version>2.3.1version>
        dependency>
        <dependency>
            <groupId>javax.activationgroupId>
            <artifactId>activationartifactId>
            <version>1.1.1version>
        dependency>
        
        <dependency>
            <groupId>org.glassfish.jaxbgroupId>
            <artifactId>jaxb-runtimeartifactId>
            <version>2.3.3version>
        dependency>

        
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
        dependency>
    dependencies>

【第二步】创建起步依赖模块

创建一个oss-essay-spring-boot-start模块,该模块引用自动配置(oss-spring-boot-autoconfigure)依赖,利用该模块内的依赖实现阿里云OSS上传的任务代码

    
    <dependencies>
        <dependency>
            <groupId>com.essaygroupId>
            <artifactId>oss-essay-spring-boot-autoconfigureartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>

实现OSS上传,需要以下三个类:

OssProperties类

该类里面存放实现OSS上需要的传配置属性(四个),并添加以下三个注解

@Data:给属性增加setter()、getter()、toString()方法

@Component:将该类加入到IOC容器中

@ConfigurationProperties(prefix = “aliyun.oss”):指定用户使用时,该配置来自于用户配置文件哪个配置

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * OSS配置类
 */
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

OssTemplate类

该类为具体实现OSS上传的类,首先为了实现OSS上传,需要OssProperties类中的信息,

因此,该类中除了OSS上传的功能代码,还需要定义一个OssProperties类对象,该类对象的实例来自用户的配置,所以需要设置一个setOssProperties的方法

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.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


/**
 * OSS功能实现类
 */
public class OssTemplate {

    private OssProperties ossProperties;

    public void setOssProperties(OssProperties ossProperties) {
        this.ossProperties=ossProperties;
    }

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        String date = sdf.format(new Date());

        // 上传到OSS Bucket下面的image文件夹内
        fileName =  "image"+ "/" + date + "/" + fileName;

        // 上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
        ossClient.putObject(ossProperties.getBucketName(), fileName, inputStream);

        // 文件访问路径
        String url = ossProperties.getEndpoint().split("//")[0] + "//" + ossProperties.getBucketName() + "." + ossProperties.getEndpoint().split("//")[1] + "/" + fileName;

        // 关闭ossClient
        ossClient.shutdown();

        // 把上传到oss的路径返回
        System.out.println(url);

        return url;
    }
}

OssAutoConfiguration类

该类的任务是自动装配Bean(OssTemplate),所以需要加@Configuration注解,

因为OssTemplate类的使用,需要用户OSS的配置(OssProperties类对象),所以还需要加一个@EnableConfigurationProperties()注解,括号内填OssProperties.class

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * OSS自动配置类
 */
@Configuration
@EnableConfigurationProperties(OssProperties.class)
public class OssAutoConfiguration {

    /**
     * 手动放入OssTemplate模板工具类
     * @param ossProperties
     * @return
     */
    @Bean
    public OssTemplate ossTemplate(OssProperties ossProperties){
        // 创建Template对象
        OssTemplate ossTemplate = new OssTemplate();

        // 设置该Template对象的OSS配置
        ossTemplate.setOssProperties(ossProperties);
        return ossTemplate;
    }
}

最后

OssAutoConfiguration类作为自动装配类,它的全类名要存在该模块的本地资源中(META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)

可以从Spring的依赖中,复制一份过来,把不需要的文件删掉

自定义阿里云OSS上传文件的start依赖_第1张图片


(复制,删除不需要的文件)

自定义阿里云OSS上传文件的start依赖_第2张图片


(org.springframework.boot.autoconfigure.AutoConfiguration.imports)

自定义阿里云OSS上传文件的start依赖_第3张图片

至此,自定义start依赖的任务就完成了。

【第三步】创建Demo模块测试

新建Demo

在新建的模块中,直接引入oss-spring-boot-start模块。因为OSS功能是在SpringBoot项目环境中使用的,所以需要parent标签中加入SpringBoot引用,使该项目成为一个SpringBoot项目。


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.essaygroupId>
    <artifactId>oss-essay-spring-boot-demoartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>11maven.compiler.source>
        <maven.compiler.target>11maven.compiler.target>
    properties>

    
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.7.10version>
        <relativePath/>
    parent>
    
    
    <dependencies>
        <dependency>
            <groupId>com.essaygroupId>
            <artifactId>oss-essay-spring-boot-startartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>

project>
import aliyun.oss.OssTemplate;
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 OssTemplate ossTemplate;

    @PostMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
        
        String url = ossTemplate.upload(file);

        return url;
    }
}

创建配置文件

再创建一个application.yml文件,里面关于OSS的配置信息要与@ConfigurationProperties(prefix = “aliyun.oss”)中的一样,才能读取到,之后正常测试即可。

自定义阿里云OSS上传文件的start依赖_第4张图片


使用postman测试

我这里以桌面上的这张图片为例

自定义阿里云OSS上传文件的start依赖_第5张图片


测试结果:

自定义阿里云OSS上传文件的start依赖_第6张图片

总结

通过自定义起步依赖,可以自己感受一下SpringBoot在底层帮助我们做的自动装配流程,同时也加深了对SpringBoot底层的理解。

你可能感兴趣的:(阿里云,java,spring)