starter

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值