阿里云OSS的自动配置主要分为:
- 驱动类 :aliyun-oss-spring-boot-autoconfigure
- 自动配置类: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容器,所以这个注解要删除
- 1.因为我们没有在pom.xml引入lombook自动构造的依赖,所以我们要删除这个注解和引入
- 解决报错问题
-
创建文件上传工具类
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