记录一次腾讯云对象存储服务(COS)的使用
目录
在完成一个练习项目时,有一个头像上传的功能需要使用 对象存储 服务,这里面的知识点还是比较多的,所以在这里记录一下。
这里我选择的是 腾讯云对象存储服务(COS),所以在这里介绍一下 腾讯云对象存储服务(COS) 的使用。
官方文档:腾讯云对象存储服务java SDK官方文档
1. 导入依赖
将下列依赖导入项目的 pom.xml
文件中:
<!--腾讯云对象存储服务cos依赖-->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.89</version>
</dependency>
2. application.yml写入参数
使用 cos 时,像 secretId
、secretKey
这种参数,一般不会直接写在类中而写在 application.yml
配置文件中,然后通过 @Value
或 @ConfigurationProperties
注解注入到 Spring 类中。
application.yml 配置文件:
cos:
secretId: xxx # 密钥id
secretKey: xxx # 密钥key
bucketName: blog-APPID # 需要使用的存储桶名称
region: ap-nanjing # 存储桶地域
secretId
、secretKey
是 腾讯云的 API密钥,
bucketName
是需要使用的存储桶名称,存储桶可以提前创建,也可以在项目中使用代码创建,
region
是 存储桶的地域。
腾讯云密钥查询入口:API密钥管理
腾讯云COS地域简称:COS地域简称
3. 注入application.yml参数
这里我定义了一个 工具类
,用于注入 application.yml
中的 cos 参数,然后方便在其它类中使用 secretId、secretKey 等参数。
package com.mrqin.utils;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component // 声明该类被spring管理
@ConfigurationProperties(prefix = "cos")
@Setter // 注意:必须有setter方法才能赋值成功
@Slf4j
public class CosPropertiesConstantsUtils implements InitializingBean {
private String secretId;
private String secretKey;
private String bucketName;
private String region;
public static String Tencent_secretId;
public static String Tencent_secretKey;
public static String Tencent_bucketName;
public static String Tencent_region;
@Override
public void afterPropertiesSet() throws Exception {
Tencent_secretId = secretId;
Tencent_secretKey = secretKey;
Tencent_bucketName = bucketName;
Tencent_region = region;
log.info("密钥初始化成功");
}
}
在这里有几个知识点:
快速了解 @ConfigurationProperties
@ConfigurationProperties和@Value孰优孰劣?
@Value @ConfigurationProperties 注释静态变量赋值
@ConfigurationProperties
注解用于批量导入application.yml
文件中的变量,比@Value
更加方便。
想要赋值成功,一定要注意:
- 启动类或配置类上应该添加
@EnableConfigurationProperties
注解;- 该类必须添加
@Component
注解,表示该类被Spring管理;- 该类必须有属性的
setter
方法,才可以成功进行属性注入,这里使用了 lombok 的@Setter
注解,简单实现了 setter 方法。
在SpringBoot官方文档中有几个注意点:
- 属性必须要有getter、setter方法;(由于我的类中是静态变量,所以没有getter)
- 如果属性的类型是集合,要确保集合是不可变的;
- 如果使用Lombok自动生成getter/setter方法,一定不要生成对应的任何构造函数,因为Spring IOC容器会自动使用它来实例化对象。
- 使用JavaBean属性绑定的方式只针对标准 Java Bean 属性,不支持对静态属性的绑定。
- 正如注意事项中的:@Configuration不支持对静态属性的绑定,所以这里使用了 afterPropertiesSet 方法(也可以使用其他方法,如使用set方法为静态变量赋值)。
- afterPropertiesSet 执行时间:实例化->生成对象->属性填充后会进行afterPropertiesSet方法,所以这里的afterPropertiesSet 方法执行后,就完成了静态变量的赋值。注意使用afterPropertiesSet需要实现InitializingBean。
4. 创建CosUtils工具类
由于 CosUtils 工具类中内容较多,所以完整代码放在最后,感兴趣的大家可以看一下,这里拆分一下:
初始化CosClient:
/**
* 初始化CosClient实例,在Springboot初始化执行一次,可以保证COSClient实例只有一个
*/
public static void initCosClient() {
//----------------------初始化客户端---------------------------
// 1 初始化用户身份信息(secretId, secretKey)。
String secretId = CosPropertiesConstantsUtils.Tencent_secretId;
String secretKey = CosPropertiesConstantsUtils.Tencent_secretKey;
COSCredentials cred = new