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

news2024/12/23 15:50:41

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

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

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

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

    <!--表明该项目为SpringBoot项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--springboot web项目依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--阿里云OSS依赖-->
        <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>
        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

        <!--一键生成domain set、get、toString依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--消除报错依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
    </dependencies>

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

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

    <!--引入自动装配模块-->
    <dependencies>
        <dependency>
            <groupId>com.essay</groupId>
            <artifactId>oss-essay-spring-boot-autoconfigure</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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的依赖中,复制一份过来,把不需要的文件删掉

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述

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

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

新建Demo

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

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>com.essay</groupId>
    <artifactId>oss-essay-spring-boot-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

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

    <!--SpringBoot项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/>
    </parent>
    
    <!--引入我们自定义的OSS起步依赖-->
    <dependencies>
        <dependency>
            <groupId>com.essay</groupId>
            <artifactId>oss-essay-spring-boot-start</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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”)中的一样,才能读取到,之后正常测试即可。

在这里插入图片描述


使用postman测试

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

在这里插入图片描述


测试结果:

在这里插入图片描述

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARIMA-LSTM】合差分自回归移动平均方法-长短期记忆神经网络研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL - 第3节 - MySQL表的操作

1.创建表 创建表的SQL如下&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释信息],field3 datatype3 [COMMENT 注释信息] )[CHARSETcharset_name] [COLLATEcollation_name] [ENGINEengine_name];说明…

springCloudAlibaba组件-Nacos-功能概述与配置(一)

文章目录 概述使用方式Nacos的关键特性 概述 一个更易于构建云原生应用的动态服务发现&#xff08;所有的微服务都注册到nacos中&#xff0c;微服务通过nacos服务中心进行服务发现&#xff09;、配置管理(主要将公共的服务配置&#xff08;如连接redis、mysql)在一个配置文件中…

【c语言初阶】操作符全面知识总结

操作符详解 操作符种类算术操作符移位操作符位操作符编程题&#xff1a;两数交换多种解法编程题&#xff1a;求一个数在内存中二进制数1的个数赋值操作符单目操作符关系操作符编程题&#xff1a;谁是凶手逻辑操作符一道笔试题条件操作符逗号表达式下标引用、函数调用和结构体成…

响应式编程理论篇:源码浅析WebClient

1 缘起 WebFlux系统中&#xff0c;如何请求第三方或其他内部兄弟系统提供的接口&#xff1f; 当然&#xff0c;可以直接使用OKhttp/Apache HttpClient/SpringMVC RestTemplate&#xff0c; 在WebFlux中同样提供了请求接口的工具&#xff1a;WebClient&#xff0c; 本篇文章主要…

03单链表及代码实现

链表介绍&#xff08;Linked List&#xff09; 链表是有序列表&#xff0c;存储方式如下图&#xff08;物理结构图&#xff09; 链表小结 链表是以结点的方式来存储的。链式存储。每个结点包含data域、next域&#xff08;指向下一个结点&#xff09;。要注意的是&#xff0…

阿里云服务器适用于哪些业务场景?有哪些行业的客户在使用?

阿里云服务器适用于哪些业务场景&#xff1f;有哪些行业的客户在使用&#xff1f;    阿里云服务器的主要业务场景   阿里云服务器能够满足各种业务场景的需求&#xff0c;具有高性能、易扩展、安全可靠等特点。下面我们将详细介绍阿里云服务器适用于哪些业务场景。 Web应用…

JUC并发编程初学

什么是JUC进程和线程回顾Lock锁生产者和消费者8锁的线程集合类不安全CallableCountDownLatch、CyclicBarrier、Semaphore读写锁阻塞队列线程池四大函数式接口Stream流式计算分支合并异步回调JMMvolatile深入单例模式深入理解CAS原子引用可重入锁、公平锁非公平锁、自旋锁、死锁…

阿里云服务器的扩展性如何?是否支持弹性扩容和自动负载均衡?

阿里云服务器的扩展性如何&#xff1f;是否支持弹性扩容和自动负载均衡&#xff1f;   阿里云服务器的扩展性特点   阿里云服务器&#xff08;ECS&#xff09;在扩展性方面具有优势&#xff0c;能够满足用户不断变化的业务需求。以下我们将详细介绍阿里云服务器的扩展性特点…

离散数学题目收集整理练习(期末过关进度50%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

Spring Security--连接数据库

书接上一篇&#xff0c;在实际的开发中&#xff0c;我们的账号密码不可能是这样写在配置文件中的&#xff0c;应该是要来自于数据库。 接着上一篇的项目&#xff0c;我们继续&#xff0c;在原有的依赖的基础上新增&#xff0c;mysql驱动依赖和mybatis依赖 <dependencies>…

拼多多和华为5年,分享一下我的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

650V IGBT 模块(FAM65V05DF1)NTMFD5C470NLT1G和NTMTS0D7N04CTXG(40V)表面贴装 MOSFET

FAM65V05DF1智能电源模块&#xff08;IPM&#xff09;是高度集成的固态电源开关&#xff0c;在单个模块中集成了基于IGBT或MOSFET的栅极驱动电路。IPM还包括电源系统免受短路、欠压和极端温度等问题的保护。 该IPM具有高集成度、小封装和出色的冷却性能&#xff0c;有助于设计…

基于Java在线云音乐系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

大学英语六级考试2022年9月真题|第一 二 三 套|9:20

【作文1】It is now widely accepted that mutual trust and openness is the key to promoting cooperation. 【作文2】Today more and more people begin to realize the pleasures and joys of real-world social interaction. 【作文3】Nowadays students are becoming …

红外测距传感芯片WH4530A

红外线又称红外光&#xff0c;它具有反射、折射、散射、干涉、吸收等性质。任何物质&#xff0c;只要它本身具有一定的温度&#xff08;高于绝对零度&#xff09;&#xff0c;都能辐射红外线。红外线传感器测量时不与被测物体直接接触&#xff0c;因而不存在摩擦&#xff0c;并…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日&#xff0c;“2023量化科技嘉年华”在上海世博中心召开&#xff0c;这场为期两天的量化科技盛会&#xff0c;多方位呈现了量化科技创新成果&#xff0c;吸引了众多关注。 在嘉年华的第二天&#xff0c;多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

编程(42)----------锁策略

简单总结一下自身对于锁策略的理解. 首先锁策略并非只针对某一种编程语言, 不同的编辑语言都可以使用同一套锁策略. 常见的锁策略有: 乐观锁和悲观锁 乐观锁, 即认为锁的竞争并非非常激烈. 悲观锁反之. 换句话说, 假设期末来临. 乐观态度的学生认为复习的很好, 问题不大. 而…

Navicat 连接 MySQL :2002 - Can‘t connect to server on ‘127.0.0.1‘ (36)

问题&#xff1a; 2002 - Can‘t connect to server on ‘127.0.0.1‘ (36) 场景 Navicat 16MySQL 5.7Windows虚拟机Mac主机 导言&#xff1a; Navicat 是一款功能强大的数据库管理工具&#xff0c;但在使用过程中可能会遇到连接 MySQL 数据库时出现 “Can’t connect to se…

微服务开发系列 第十篇:Gateway

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…