一、 自定义Starter模块
- 在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter(起步依赖)。
1.1实例–阿里云OSS的配置
- 前言:我们在使用阿里云上传的时候需要开发一系列的东西(引入依赖,开发工具类Utils等),现在自定义AliyunOSS Starter 就可以简化开发。
1.1.1 需求
- 需求:自定义
aliyun-oss-spring-boot-starter
,完成阿里云OSS操作工具类AliyunOsSUtils
的自动配置。 - 目标:引入起步依赖引入之后,要想使用阿里云OSS,注入
AliyunosSUtils
直接使用即可。
1.1.2 步骤
-
- 创建
aliyun-oss-spring-boot-starter
模块
- 创建
-
- 创建
aliyun-oss-spring-boot-autoconfigure
模块,在starter中引入该模块
- 创建
-
- 在
aliyun-oss-spring-boot-autoconfigure
模块中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxxx.imports
- 在
1.1.3 具体实现
- 创建两个模块,并填写基本信息:
生成的模块中除了
pom.xml
和aliyun-oss-spring-boot-starter.iml
文件和文件夹,其余都是无用处的,可删除,使之简洁。
- 同理,创建名为
aliyun-oss-spring-boot-autoconfigure
的模块,保留src文件夹和pom.xml
和aliyun-oss-spring-boot-starter.iml
文件,其余删除。
- 在starter的pom.xml文件中引入configure的依赖。
- 定义自动配置功能
- 在configure模块的pom.xml文件中引入aliyun OSS的依赖
- 将需要的utils文件放到com.aliyun.oss目录下(会用到Springboot的启动依赖等,自行配置)
- 阿里云 OSS 工具类源码1:
AliOSSProperties
类
package com.aliyun.oss;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
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;
}
}
- 阿里云 OSS 工具类源码2:
AliOSSUtils
类
package com.aliyun.oss;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
public class AliOSSUtils {
private AliOSSProperties aliOSSProperties;
public AliOSSProperties getAliOSSProperties() {
return aliOSSProperties;
}
public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
this.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的路径返回
}
}
- 自动配置类:
package com.aliyun.oss;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//自动配置类
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class) //将AliOSSProperties类导入进来,相当于一个bean对象了
public class AliOSSConfiguration {
@Bean //声明为IOC中的bean,使用时,直接注入此对象来使用
public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties) { //指定此类型的额参数,会自动根据类型来装配
AliOSSUtils aliOSSUtils = new AliOSSUtils();
aliOSSUtils.setAliOSSProperties(aliOSSProperties);
return aliOSSUtils;
}
}
- 最后在下图的文件中,配置
AliOSSConfiguration
的全类名,将来Springboot在启动此文件的时候就会自动加载,将上述的自动配置类AliOSSConfiguration
导入到Springboot 的IOC容器管理中,在项目中使用就可以直接注入AliOSSUtils
这个bean对象来使用。
最后一点:使用时还需要将aliyun的配置信息写在yml文件下: