SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

news2024/9/24 9:23:33

本文同步更新于鼠鼠之家SpringBoot——原理(自动配置_案例(自定义阿里云文件上starter)) - 鼠鼠之家~我要怎么水够标题长度

starter定义

starter就是springboot中的起步依赖,虽然springboot已经提供了很多的起步依赖,但是在实际项目开发中可能会用到和第三方的技术,不是所有第三方在springboot中都有收录。

比如之前文章中有用到过的阿里云OSS,阿里云并没有提供起步依赖,导致每次使用时都要自己写一些类。

springboot官方提供的起步以来是spring-boot在前,其他提供的通常都是技术名在前。

下面mybatis的起步依赖中没有java代码,只是整合了mybatis开发需要的依赖的坐标 其中包含了一个依赖mybatis-spring-boot-autoconfigure,这个自动配置类里面声明了一堆Bean对象。

 里面可以看见一些常用的类比如SqlSessionFactory 

那么这些配置类配置好之后是如何被SpringBoot项目加载到IOC容器并完成自动配置的呢?

前面有说到过,SpringBoot在启动时会加载依赖中的两份文件,如果是老版本的就加载spring.factories,如果是新版本的就加载autoconfigure.import这个文件。

因此该自动配置类配置好之后,就可以在spring.factories或者是autoconfigure.import文件中配置这个自动配置类。

最终会儿被加载到spring的IOC容器当中.

因此自定义一个起步依赖starter的时候按照规范需要定义两个模块,一个是starter模块,其唯一的作用就是进行依赖管理。

另一个autoconifure的包就是完成自动配置的操作。 

最终在项目中只会导入starter模块,因为starter已经导入了autoconfigure模块了。        

上面就是简单介绍了自定义starter的场景以及自定义starter涉及的各个模块和各个模块涉及的功能.

自定义starter案例

需求说明

在不封装的时候,每次使用都要自己手动写一些OSS的工具类并添加到IOC容器当中去。

根据阿里云官方提供的示例SDK文件改造成如下一个工具类,并在yml配置文件当中配置需要的参数,然后还要一个实体类加载配置文件中的配置项。

最后才可以在工具类中获取到需要的参数,然后交给springIOC容器管理,然后在项目用到时就直接注入。

这个过程十分的繁琐

 

具体封装看这里一下两篇文章

云服务——阿里云OSS的入门使用_北岭山脚鼠鼠的博客-CSDN博客SpringBoot——SB整合mybatis案例(残缺版本)第三集_北岭山脚鼠鼠的博客-CSDN博客

上面的这个过程是十分繁琐且重复的一个过程,因此可以将其封装成一个依赖项,可以通过坐标引入后直接使用。

步骤分析

具体实现 

创建好两个需要的模块

选择新建新模块

首先新建一个starter模块

 规整starter模块的pom.xml文件如下

先改版本为2.7.5,再删除多余的依赖。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

然后starter模块的项目文件删除的只剩下一个pom.xml和一个iml文件。

然后再新建一个autoconfigure的模块,按照上面的流程再走一次

然后修改 autoconfigure模块的pom.xml如下,将项目文件删成如下的结构,只比上面多一个src

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

    </dependencies>

</project>

将来autoconfigure是作为其他项目文件的依赖的,所以application这个启动类不需要,配置文件也不需要,测试单元也不需要。删除如下图所示的三个文件 

模块创建工作结束 (上面就准备好了一个依赖所需要的两个基本模块了)

然后需要在starter模块引入autoconfigure模块,这是前面提到过的规范。

直接导入autoconfigure的坐标。

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

在autoconfigure中完成自动配置操作

 根据目标需求,需要在autoconfigure准备一个AliyunOSSUtils工具类。

1.引入依赖

要在项目中使用阿里云OSS需要引入阿里云OSS的依赖,引入如下依赖在autoconfigure中

        <!--阿里云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>

2.准备工具类和实体类 

在之前的项目开发中使用阿里云OSS时需要用到的类有一个工具类和一个实体类

实体类里面封装的是阿里云的key和id还有资源桶的名字

package com.example.utils;

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

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

还有一个工具类

package com.example.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */

@Component
public class AliOSSUtils {

    //    @Value("${aliyun.oss.endpoint}")
//    private String endpoint ;
//    @Value("${aliyun.oss.accessKeyId}")
//    private String accessKeyId ;
//    @Value("${aliyun.oss.accessKeySecret}")
//    private String accessKeySecret ;
//    @Value("${aliyun.oss.bucketName}")
//    private String bucketName ;

/*    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;*/


    @Autowired
    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        String endpoint=aliOSSProperties.getEndpoint();
        String bucketName=aliOSSProperties.getBucketName();
        String accessKeyId=aliOSSProperties.getAccessKeyId();
        String accessKeySecret=aliOSSProperties.getAccessKeySecret();

        // 获取上传的文件的输入流

        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("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

将上面两个文件放到autoconfigure项目中时会有一个报错,需要引入两个新的依赖

一个是web开发的以来,一个是@Data注解的依赖,又或者可以不引入lombok的以来,然后手动提供get和set方法。直接把@Data的注解去掉即可,然后alt+insert即可

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

然后两个类都没有报错了,但是现在两个类上的component注解已经没有用了,因为将来这个依赖引入项目时包扫描也不会扫这个依赖模块的包,所以两个类上的@component注解可以删除了。

注意:这里删除会导致aliOSSProperties实体类出现红色报错,但是这里可以先不用管,下面会解决。

然后还有工具类里面的@Autowired也可以删除了,因为已经不是IOC容器里面的Bean了,不能进行autowired注入了。

但是根据需求提到的直接注入工具类直接使用,所以还是要将其交给spring容器进行管理。

因此现在需要准备一个自动配置类来声明阿里云OSS的这个工具类的Bean,然后将配置类交给spring容器管理。

3.新建自动配置类

这个配置类可以获取到AliOSSUtils这个工具类的,然后直接使用upload方法进行文件上传操作,但是在那之前upload方法里面是还需要一个aliOSSProperties成员变量的,所以在工具类当中还要准备它的get和set方法.

然后在获取到AliOSSUtils时还需要为里面的aliOSSProperties赋值。

然后aliOSSProperties当中需要的属性值都是从配置文件当中获取得到的,然后封装成一个aliOSSProperties实体类。

@ConfigurationProperties(prefix = "aliyun.oss")

这里需要解决上面这块的报错问题,可以直接在自动配置类上加上如下的注解,将AliOSSProperties变成一个IOC容器中Bean对象就不会报错了。

@EnableConfigurationProperties(AliOSSProperties.class)

再然后在配置类,声明一个第三方Bean时需要注入某一个对象可以直接在方法形参中指定,最终会自动装配进来。


@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {
    @Bean
    public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
        AliOSSUtils aliOSSUtils= new AliOSSUtils();
        aliOSSUtils.setAliOSSProperties(aliOSSProperties);
        return aliOSSUtils;
    }
}

到这里,自动配置类已经配置好了,另外两个类别忘记删除@Component和@Autowried注解并且加上aliOSSProperties的get还有set方法就可以了。

4.最后一步

要想自动配置类被加载到项目中就需要在一个固定的配置文件中来配置。

就是META-INF/spring/xxx.imports中,所以现在autoconfigure模块的resources目录下新建一个对应的文件夹和需要的一个名字很长的文件。

注意名字不能打错。

在这个文件中的都是自动配置类的全类名,所以要把上面写好的一个自动配置类放到里面去。 

com.aliyun.oss.AliOSSAutoConfiguration

到此,这个starter已经定义完了,在starter中进行依赖管理,在configure中进行自动配置。

在测试工程中对封装好的starter进行测试

在提供的资源中有一个测试工程。

在这个测试工程的Controller层中有一个uploadController如下,需要将接收到文件上传到阿里云OSS。

然后这里可以直接引入上面的起步依赖,然后就可以直接上传文件到OSS了。

在测试工程的pom文件当中,引入如下依赖。

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-oss-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 然后就需要在配置文件当中需要一些阿里云账号的参数,需要的配置信息有如下的四项,都需要在测试工程的配置文件上准备好。

这里根据个人的实际账号资料进行配置。 

 

最后在controller当中实现如下,将已经上传的文件交给阿里云OSS进行保存

@RestController
public class UploadController {
    @Autowired
    private AliOSSUtils aliOSSUtils;


    @PostMapping("/upload")
    public String upload(MultipartFile image) throws Exception {
        //上传文件到阿里云 OSS
        String url=aliOSSUtils.upload(image);
        return url;
    }
}

项目运行测试 (使用postman测试)

上面那里将依赖导入别的项目时可能会有出现Cannot reconnect的傻狗报错,这时候只需要重启IDEA即可。

成功上传文件到阿里云并且获得了文件url。 

完成了这个依赖封装,我就可以自己搞一个网页,然后自己上传自己的东西,然后自己下载自己的东西了。 真不错。

小结

 SpringBoot原理章节完结撒花!

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

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

相关文章

Yolov5s算法从训练到部署

文章目录 PyTorch GPU环境搭建查看显卡CUDA版本Anaconda安装PyTorch环境安装PyCharm中验证 训练算法模型克隆Yolov5代码工程制作数据集划分训练集、验证集修改工程相关文件配置预训练权重文件配置数据文件配置模型文件配置 超参数配置 测试训练出来的算法模型 量化转换算法模型…

云南LED、LCD显示屏系统建设,户外、室内广告大屏建设方案

LED大屏幕显示系统是LED高清晰数字显示技术、显示单元无缝拼接技术、多屏图像处理技术、信号切换技术、网络技术等科技手段的应用综合为一体&#xff0c;形成一个拥有高亮度、高清晰度、技术先进、功能强大、使用方便的大屏幕投影显示系统。通过大屏幕显示系统&#xff0c;可以…

SpringBoot1-案例以及快速启动

1.概述 简化Spring应用的初始搭建以及开发过程 原生开发SpringMVC程序过程 创建一个Maven工程&#xff0c;在pom打入坐标&#xff1b;配置类ServletConfig&#xff0c;初始化Spring容器和SpringMVC容器&#xff1b;创建配置类SpringConfig和SpringMVC配置类&#xff1b;至少要有…

NLP基础模型和注意力机制

3.1 基础模型 欢迎来到本次课程的最后一周的内容&#xff0c;同时这也是五门深度学习课程的最后一门&#xff0c;你即将抵达本课程的终点。 你将会学习seq2seq&#xff08;sequence to sequence&#xff09;模型&#xff0c;从机器翻译到语音识别&#xff0c;它们都能起到很大…

Azure OpenAI Service可以直接出题

使用模型和部署模型名称&#xff1a; Model name: text-davinci-003Deployment name: text-davinci In the Completions page, ensure your text-davinci deployment is selected and then in the Examples list, select Classify text. Replace all of the text in the pro…

通义听悟诞生背后,AI大模型打响应用第一枪

配图来自Canva可画 2023年伊始&#xff0c;ChatGPT的爆火出圈&#xff0c;迅速引发了业界对于生成式AI应用的关注&#xff0c;AI大模型的竞争更是愈演愈烈。 作为参与其中的重要玩家&#xff0c;阿里云先是在4月11日举行的阿里云峰会上&#xff0c;推出了通义千问大模型。紧接…

【Linux】生产者 消费者模型

文章目录 1.关于模型的理解为什么会存在超市&#xff1f;如何维护线程互斥与同步&#xff1f;生产消费模型 角色之间的关系 2. 交易场所的设计具体实现主函数的实现BlockQueue类的实现push ——生产pop——消费 细节问题误唤醒效率高 体现在哪里&#xff1f; 完整代码blockQueu…

Linux之动态库和静态库

文章目录 前言一、动态库和静态库概念二、库三、制作静态库1. 创建Makefile&#xff1a;2.打包库3.使用库总结注意库的安装 四、制作动态库总结 五、动静态库的加载总结 前言 一、动态库和静态库概念 在之前的文章中&#xff0c;介绍过动静态库的概念&#xff0c;因此这次我们…

微信小程序面试题汇总

HTML篇CSS篇JS篇Vue篇TypeScript篇React篇前端面试题汇总大全&#xff08;含答案超详细&#xff0c;HTML,JS,CSS汇总篇&#xff09;-- 持续更新前端面试题汇总大全二&#xff08;含答案超详细&#xff0c;Vue&#xff0c;TypeScript&#xff0c;React&#xff0c;Webpack 汇总篇…

虎牙在全球 DNS 秒级生效上的实践2

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

pytest使用手册

1. pytest寻找测试项的具体规则 如果未指定命令行参数&#xff0c;则从pytest命令运行的当前目录开始收集。如果在命令行参数中指定了目录、文件名则按参数来寻找。寻找过程会按照目录层层递归&#xff0c;在这些目录中&#xff0c;搜索 test_*.py 或 *_test.py 文件。从这些文…

GPT-4变笨引爆舆论!文本代码质量都下降,OpenAI刚刚回应了降本减料质疑

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 大模型天花板GPT-4&#xff0c;它是不是……变笨了&#xff1f; 先是少数用户提出质疑&#xff0c;随后大量网友表示自己也注意到了&#xff0c;还贴出不少证据。 有人反馈&#xff0c;把GPT-4的3小时25条对话额度一口气用完…

PDF怎么转换成WORD?分享这几个方法给大家!

PDF怎么转换成Word&#xff1f;在我们的工作过程中&#xff0c;经常会使用到PDF文件、Word文件等等。而在很多时候&#xff0c;需要根据工作需求&#xff0c;将各种文件进行格式转换&#xff0c;例如将PDF文件转换成Word格式&#xff0c;从而满足我们对文件进行编辑、更改等需求…

learn C++ NO.8——初识模板(函数模板、类模板)

文章目录 引言1.泛型编程1.1.什么是泛型编程&#xff1f; 2.函数模板2.1.什么是函数模板2.2.为什么需要函数模板2.3.函数模板格式2.4.函数模板实现原理2.5.函数模板的实例化 3.类模板3.1.类模板定义格式3.1.1.类模板语法3.1.2.模板类的定义 3.2.模板类的实例化 引言 现在是北京…

Hadoop之Yarn概述

Hadoop之Yarn概述 Yarn是什么Yarn基础架构Yarn工作机制回顾HDFS、YARN、MapReduce三者关系Yarn调度器和调度算法先进先出调度器&#xff08;FIFO&#xff09;容量调度器&#xff08;Capacity Scheduler&#xff09;公平调度器&#xff08;Fair Scheduler&#xff09; Yarn常用命…

SpringBoot整合SpringSession实现分布式登录详情

目录 Session 共享为什么服务器 A 登录后&#xff0c;请求发到服务器 B&#xff0c;不认识该用户&#xff1f;解决方案SpringBoot整合SpringSession实现分布式登录 Session 共享 比如两个域名&#xff1a; aaa.yupi.combbb.yupi.com如果要共享 cookie&#xff0c;可以种一个…

事件机制原理剖析及实际业务应用说明

什么是事件&#xff1f; 一个特定的场景发生了一个特定的情况就是一个事件。 事件在设计中的作用 为对象之间解耦。 举例 现有用户中心和消息中心。 目前&#xff0c;有一个用户注册的场景&#xff0c;此场景要求用户注册成功后要给用户发送多渠道欢迎通知&#xff08;微信、…

(11) XGBoost

文章目录 1 简要介绍2 梯度提升树2.1 提升集成算法&#xff1a;重要参数n_estimators2.2 有放回随机抽样&#xff1a;重要参数subsample2.3 迭代决策树&#xff1a;重要参数 η \eta η 3 XGBoost的智慧3.1 选择弱评估器&#xff1a;重要参数booster3.2 目标函数&#xff1a;重…

SpringCloud_微服务基础day2(Eureka注册中心:服务注册与发现

p6:Eureka简介与依赖导入 前面我们了解了如何对单体应用进行拆分&#xff0c;并且也学习了如何进行服务之间的相互调用&#xff0c;但是存在一个问题&#xff0c;就是虽然服务拆分完成&#xff0c;但是没有一个比较合理的管理机制&#xff0c;如果单纯只是这样编写&#xff0c…

HBase:(三)HBase API

HBase:(一)安装部署_只爱大锅饭的博客-CSDN博客hbase部署安装https://blog.csdn.net/qq_35370485/article/details/130988364?spm1001.2014.3001.5501 1.创建maven项目 2.添加依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hba…