首页 > 其他分享 >关于自己写阿里云OSS相关工具类的自动配置(黑马web开发day14)

关于自己写阿里云OSS相关工具类的自动配置(黑马web开发day14)

时间:2024-10-29 23:16:21浏览次数:10  
标签:web String spring OSS boot day14 aliyun import oss

阿里云OSS的自动配置主要分为:

  1. 驱动类 :aliyun-oss-spring-boot-autoconfigure
  2. 自动配置类:aliyun-oss-spring-boot-starter

    文章目录

aliyun-oss-spring-boot-starter

创建aliyun-oss-spring-boot-starter

![](https://i-blog.csdnimg.cn/direct/5be7a4de7d1446edabf09bb202b217c2.png#pic_center

  • 1.创建springboot工程
    注意这里驱动模块位置一定不能被其他工程包涵,否则其他工程用不了在这里插入图片描述
    如果选择springboot版本如果没有,可以选低版本,等项目创建后再更改springboot版本,并且不用选择其他的依赖,我们这个只是用于驱动

    在这里插入图片描述

  • 2.删除不需要的文件
    在这里插入图片描述
    如果我们想找到我们的aliyun-oss-spring-boot-starter.iml,需要我们双击Ctrl,然后运行代码` c mvn idea:module
    在这里插入图片描述
    这样我们的iml文件就出来了
    在这里插入图片描述

  • 3.删除pom.xml不需要的依赖,以及更改里面的版本

    首先更改我们springboot的版本
    在这里插入图片描述
    然后删除不需要的信息,这个描述信息可删可不删
    在这里插入图片描述
    这个测试依赖我们并不需要,因为我们在之前就删除了测试方法,我们这个模块并不需要测试
    在这里插入图片描述
    并且把这个插件也要删除,在驱动模块当中并没有作用,因为我们这个模块只是负责配置,在被工程使用的时候,工程会依赖这个插件,所以我们不需要重复依赖
    在这里插入图片描述
    这样我们的aliyun-oss-spring-boot-starter模块也就创建完了

aliyun-oss-spring-boot-autoconfigure

创建aliyun-oss-spring-boot-autoconfigure

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/321598d6b995462487f26f40d88585a7.png#pic_center

  • 1.创建springboot工程
    注意这里驱动模块位置一定不能被其他工程包涵,否则其他工程用不了
    在这里插入图片描述
    如果选择springboot版本如果没有,可以选低版本,等项目创建后再更改springboot版本,并且不用选择其他的依赖,我们这个只是用于驱动
    在这里插入图片描述
  • 2.删除不需要的文件
    在自动配置模块当中测试方法并不需要,以及一些文件
    在这里插入图片描述
  • 3.删除pom.xml不需要的依赖,以及更改里面的版本
    首先更改我们springboot的版本
    在这里插入图片描述
    然后删除不需要的信息,这个描述信息可删可不删
    在这里插入图片描述
    这个测试依赖我们并不需要,因为我们在之前就删除了测试方法,我们这个模块并不需要测试
    在这里插入图片描述
    并且把这个插件也要删除,在自动配置模块当中并没有作用,因为我们这个模块只是负责配置,在被工程使用的时候,工程会依赖这个插件,所以我们不需要重复依赖
    在这里插入图片描述
  • 4.配置我们所需要的依赖
    复制代码到pom.xml当中,并且刷新,这样我们才能使用阿里云OSS工具类
    		<!--阿里云oss上传-->
    		<dependency>
    			<groupId>com.aliyun.oss</groupId>
    			<artifactId>aliyun-sdk-oss</artifactId>
    			<version>3.17.4</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>
    
    在这里插入图片描述
  • 5.创建需要的工具类
    • 1.创建用户信息的类

      package com.aliyun.oss;
      import lombok.Data;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.stereotype.Component;  
      
      @Data
      @Component  
      @ConfigurationProperties(prefix = "aliyun-oss")
      //ConfigurationProperties可以批量将外部属性配置注入到对象属性中
      //Value只能一个一个进行外部属性注入
      public class AliOSSProperties {
          private String endpoint;
          private String accessKeyId;
          private String accessKeySecret;
          private String bucketName;
      }
      

      在这里插入图片描述

      • 解决报错问题
        • 1.因为我们没有在pom.xml引入lombook自动构造的依赖,所以我们要删除这个注解和引入
          在这里插入图片描述
        • 2.因为我们这个是第三方依赖,并不会有IOC容器管理,所以项目工程并不会扫描,所以无法将直接该类放入IOC容器,所以这个注解要删除
          在这里插入图片描述
    • 创建文件上传工具类

      package com.aliyun.oss;
      
      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.IOException;
      import java.io.InputStream;
      import java.util.UUID;
      
      /**
       * 阿里云 OSS 工具类
       */
      @Component
      public class AliOSSUtils {
          /*@Value("${aliyun.oss.endpoint}")//注入web.xml配置文件中的属性值
          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 {
              //获取阿里云oss对象
              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("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
              // 关闭ossClient
              ossClient.shutdown();
              return url;// 把上传到oss的路径返回
          }
      
      }
      

      在这里插入图片描述

      • 解决报错问题
        • 1.因为我们这个是第三方依赖,并不会有IOC容器管理,所以项目工程并不会扫描,所以无法将直接该类放入IOC容器,所以这个注解要删除
          在这里插入图片描述

        • 2.因为我们这个是第三方依赖,并不会有IOC容器管理,所以项目工程并不会扫描,所以无法将直接依赖注入,所以这个注解要删除
          在这里插入图片描述

        • 3.因为要接收文件,但是我们的依赖当中没有web的依赖,所以我们要在pom.xml当中配置,下面两个图片出现的错误都是因为这个
          在这里插入图片描述

          在这里插入图片描述
          要添加的依赖:
          代码:

          		<dependency>
          			<groupId>org.springframework.boot</groupId>
          			<artifactId>spring-boot-starter-web</artifactId>      
          		</dependency>
          

          在这里插入图片描述

        • 4.因为用户信息的类当中并没有这四个方法,所以只需要添加就行了
          在这里插入图片描述
          代码

          	public String getEndpoint() {
                  return endpoint;  
              }
          
              public void setEndpoint(String endpoint) {
                  this.endpoint = endpoint;
              }
          
              public String getAccessKeyId() {
                  return accessKeyId;
              }
          
              public void setAccessKeyId(String accessKeyId) {
                  this.accessKeyId = accessKeyId;
              }
          
              public String getAccessKeySecret() {
                  return accessKeySecret;
              }
          
              public void setAccessKeySecret(String accessKeySecret) {
                  this.accessKeySecret = accessKeySecret;
              }
          
              public String getBucketName() {
                  return bucketName;
              }
          
              public void setBucketName(String bucketName) {
                  this.bucketName = bucketName;
              }
          

          在这里插入图片描述

    • 创建我们的自动配置类
      因为我们要想通过依赖注入的方式,来直接使用AliOSSUtils这个类的方法,我们就需要创建一个自动配置类,来将该AliOSSUtils类放入到项目工程的IOC容器当中
      代码:

      package com.aliyun.oss;
      
      import org.springframework.context.annotation.Bean;  
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      
      public class AliOSSAutoConfiguration {
          @Bean
          public AliOSSUtils aliOSSUtils(){
              AliOSSUtils aliOSSUtils = new AliOSSUtils();
              aliOSSUtils.setAliOSSProperties();
              return new AliOSSUtils();
          }
      }
      

      在这里插入图片描述

  • 6.解决三个类之间的关系出现问题
    • 因为在upload方法当中我们调用了aliOSSProperties的方法,但是我们并没有给aliOSSProperties赋值,会出现空指针异常,所以我们需要给aliOSSProperties创建get和set方法

      	public AliOSSProperties getAliOSSProperties() {    
              return aliOSSProperties;
          }
      
          public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
              this.aliOSSProperties = aliOSSProperties;
          }
      

      在这里插入图片描述

    • 当我们把AliOSSProperties里面的@Component删除之后,就会报错,这是因为@ConfigurationProperties会从配置文件当中找到aliyun-oss的信息,将我们这个类
      封装成一个bean,但是我们的@Component已经不存在,无法将这个类交给IOC容器管理在这里插入图片描述
      解决办法:
      我们通过IDEA的提示来解决,使用@EnableConfigurationProperties这个注解,这个注解底层封装了import这个注解,来将我们这个类交给IOC容器管理,在 AliOSSAutoConfiguration加入代码
      c @EnableConfigurationProperties(AliOSSProperties.class)

      在这里插入图片描述
      加入代码后

      在这里插入图片描述
      在这里插入图片描述

    • 因为我们在方法aliOSSUtils.setAliOSSProperties(),当中需要AliOSSProperties这个对象,所以我们要获取AliOSSProperties这个对象,在@Bean这个第三方bean可以通过形参的方式来获得AliOSSProperties这个对象
      代码

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

      在这里插入图片描述

    • 在aliyun-oss-spring-boot-autoconfigure这个依赖当中我们虽然定义了自动配置类,但是我们还是要创建自动配置文件,我们需要在resources中创建包和文件,并且在文件当中写入自动配置类的名字
      包:

      META-INF/spring
      

      文件名:

      org.springframework.boot.autoconfigure.AutoConfiguration.imports
      

      自动配置类:

      com.aliyun.oss.AliOSSAutoConfiguration
      

      在这里插入图片描述

starter引入autoconfigure这个依赖

我们只需要在我们的aliyun-oss-spring-boot-starter引入我们的aliyun-oss-spring-boot-autoconfigure,根据依赖的传递性,我们的aliyun-oss-spring-boot-starter当中也就有了这个依赖
代码:

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

在这里插入图片描述

测试代码创建

  • 1.springboot测试代码创建
    在这里插入图片描述
    注意我们这个需要引入web的依赖这样我们才可以接收文件
    在这里插入图片描述
    如果我们的项目目录当中没有出现我们的springboot工程
    在这里插入图片描述
    我们需要在旁边的maven按钮自己打开
    在这里插入图片描述
  • 2.删除不需要的文件
    在这里插入图片描述

  • 3.pom.xml配置的第三方依赖的注入
    代码:

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

    在这里插入图片描述

  • 4.测试代码类文件的创建

    controller.UploadController
    

在这里插入图片描述

  • 5.代码类的实现
    类代码:

    package com.itheima.controller;                                                                        
    
    import com.aliyun.oss.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;
    
    @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;
        }
    
    }
    

    在这里插入图片描述

  • 6.配置文件的修改
    代码:

    aliyun-oss.endpoint=https:  
    aliyun-oss.access-key-id=     
    aliyun-oss.access-key-secret=
    aliyun-oss.bucket-name=
    

    在这里插入图片描述
    如果我们的配置文件为yml的话
    代码:

    aliyun:
      aliyun-oss:
        # 域名
        endpoint:
        # key
        accessKeyId:
        # 密钥
        accessKeySecret:
        # 存储位置名称
        bucketName:
    

    注意冒号之后必须要加一个空格在这里插入图片描述

代码测试

首先启动我们的springbooot工程,然后打开我们的postman,输入网址,进行测试

http://localhost:8080/upload

注意这里的请求方式为post

在这里插入图片描述
结果
在这里插入图片描述
这样我们的第三方依赖也就写好了

注意:

在我们的aliyun-oss-spring-boot-autoconfigure与我们的测试项目里面的配置文件当中,这两个必须相同,否则就会出现空指针异常,读出来的用户信息都为null
在这里插入图片描述
在这里插入图片描述

标签:web,String,spring,OSS,boot,day14,aliyun,import,oss
From: https://blog.csdn.net/2302_80446546/article/details/143326386

相关文章

  • Webstorm 2024 安装使用 (附加永久激活码、补丁)
    下载安装第二步,安装完成之后,下载补丁下载地址(里面包含激活码)完成,之后输入激活码免责声明:本文中的资源均来自互联网,仅供个人学习和交流使用,严禁用于商业行为,下载后请在24小时内从电脑中彻底删除。对于因非法使用而引起的版权争议,与作者无关。所有资源仅供学习、参考......
  • springmvc-servlet.xml和web.xml文件的存放路径是哪里?项目添加到Tomcat上运行后就报错
        用eclipse写了一个简单的web项目,springmvc-servlet.xml文件和web.xml文件都配置好了,运行起来能看见hello的web页面,但是有一堆报错,不知道是什么原因                                     ......
  • javascript-Web APLs (三)
     事件流指的是事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 简单来说:捕获阶段是从父到子冒泡阶段是从子到父 实际工作都是使用事件冒泡为主事件捕获DOM.addEventListener(事件类型,事件处......
  • ctfshow-web入门-爆破(24)
    1.根据题目提示:参考PHP随机数的伪随机数mt_srand(seed);函数播种MersenneTwister随机数生成器。seed,可选。从PHP4.2.0开始,随机数生成器自动播种,因此没有必要使用该函数因此不需要播种,并且如果设置了seed参数生成的随机数就是伪随机数,意思就是每次生成的随机数是一......
  • 2024网鼎杯初赛-青龙组-WEB gxngxngxn
    WEB01开局随便随便输入都可以登录,登上去以后生成了一个token和一个session,一个是jwt一个是flask框架的这边先伪造jwt,是国外的原题CTFtime.org/DownUnderCTF2021(线上)/JWT/Writeup先生成两个token,然后利用rsa_sign2n工具来生成公钥python3jwt_forgery.pyeyJhbGciOi......
  • webpack总结
    ......
  • 代码随想录day14 二叉树(2)
    文章目录day11栈与队列(2)栈与队列的总结day13二叉树(1)day14二叉树(2)day11栈与队列(2)逆波兰表达式求值https://leetcode.cn/problems/evaluate-reverse-polish-notation/逆波兰表达式,也就是后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种......
  • 关于Rust使用cross进行交叉编译,openssl报错
    遇到错误详情解决:使用cross交叉编译,确保已经安装好了openssl的相关依赖,但是依然报和openssl有关的错误,此时需要在 Cargo.toml 添加openssl的依赖查看:https://github.com/sfackler/rust-openssl?tab=readme-ov-file1[dependencies]2openssl={version="0.10",feat......
  • 【论文笔记】C$^2$RL: Content and Context Representation Learning for Gloss-free
    ......
  • 【Nginx学习】5步轻松搞定:用Nginx配置一个静态Web服务器,文件路径定义你真的会了吗?
    ......