1.aliyun-starter
AliyunAutoConfiguration.java
package com.qlu.health.aliyun;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//启动AliyunOssConfig
@EnableConfigurationProperties(AliyunOssConfig.class)
public class AliyunAutoConfiguration {
@Bean
public AliyunOSSUtils aliyunOSSUtils(AliyunOssConfig config){
return new AliyunOSSUtils(config);
}
}
AliyunOssConfig.java
package com.qlu.health.aliyun;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
//@Configuration
@ConfigurationProperties(prefix = "aliyun.oss") // 以aliyun.oss开头的属性 封装到AliyunOssConfig中
public class AliyunOssConfig {
private String endpoint;
private String bucketName;
private User user;
@Data
public static class User{
private String username;
private String password;
}
}
AliyunOSSUtils .java
package com.qlu.health.aliyun;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
import java.util.UUID;
/**
* 阿里云OSS操作工具类
*/
@Slf4j
public class AliyunOSSUtils {
private AliyunOssConfig aliyunOssConfig;
public AliyunOSSUtils(AliyunOssConfig aliyunOssConfig){
this.aliyunOssConfig =aliyunOssConfig;
}
/**
* 上传文件
* @param content 内容字节数组
*/
public String upload(byte[] content, String extName) throws Exception {
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// DefaultCredentialProvider credentialsProvider = CredentialsProviderFactory.newDefaultCredentialProvider(accesskey, secretKey);
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = UUID.randomUUID() + extName;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(aliyunOssConfig.getEndpoint(), credentialsProvider);
try {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(aliyunOssConfig.getBucketName(), objectName, new ByteArrayInputStream(content));
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
log.error("Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.");
log.error("Error Message:" + oe.getErrorMessage());
log.error("Error Code:" + oe.getErrorCode());
log.error("Request ID:" + oe.getRequestId());
log.error("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
log.error("Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.");
log.error("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
// https://oss-cn-beijing.aliyuncs.com
// https://bucketName.oss-cn-beijing.aliyuncs.com/objectName
return aliyunOssConfig.getEndpoint().split("//")[0] + "//" + aliyunOssConfig.getBucketName() + "." + aliyunOssConfig.getEndpoint().split("//")[1] + "/" + objectName;
}
}
记得一定要把AliyunOssConfig .java的注解Configuration给注释,不然AliyunAutoConfiguration会注入两次
上网找了原因,是因为
在AliyunAutoConfiguration类中,使用了@EnableConfigurationProperties(AliyunOssConfig.class)注解来启用对AliyunOssConfig类的处理。这个注解的作用是将配置文件中以aliyun.oss开头的属性封装到AliyunOssConfig类的实例中。
当Spring容器启动时,它会扫描所有的配置类,并创建相应的bean。在这个例子中,AliyunAutoConfiguration类被标记为@Configuration,表示它是一个配置类。同时,AliyunOssConfig类也被标记为@ConfigurationProperties(prefix = “aliyun.oss”),表示它将封装配置文件中以aliyun.oss开头的属性。
由于AliyunAutoConfiguration类和AliyunOssConfig类都使用了@Configuration注解,因此它们都会被Spring容器识别为配置类。但是,由于AliyunAutoConfiguration类还使用了@EnableConfigurationProperties(AliyunOssConfig.class)注解,它会自动创建一个AliyunOssConfig类型的bean,并将其注册到Spring容器中。
因此,当放开@Configuration注解时,Spring容器会将AliyunAutoConfiguration类和AliyunOssConfig类都识别为配置类,并分别创建它们的bean。这就导致了有两个相同的bean。为了避免这种情况,可以将AliyunAutoConfiguration类中的@Configuration注解去掉,只保留@EnableConfigurationProperties(AliyunOssConfig.class)注解。这样,Spring容器只会创建一个AliyunOssConfig类型的bean,而不会创建AliyunAutoConfiguration类的bean。
顺便复习了一下bean注入的三种方式,发现自己都忘了呜呜呜
@Autowired注入的3种方式
-
字段注入
@Autowired private UserService userService;
-
构造函数注入
private final UserService userService; @Autowired //如果只有一个构造函数,@Autowired 可以省略 public UserController(UserService userService){ this.userService = userService; }
-
set方法注入
private UserService userService; @Autowired public void setUserService(){ this.userService = userService; }
找到一个大哥写的挺好引用一下他的https://blog.csdn.net/qq_58284486/article/details/127965965