源码劝退之阿里云 OSS SDK -Java

282 阅读1分钟

从new函数开始,看一下biuld函数

// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

(1)Build函数

@Override
    public OSS build(String endpoint, String accessKeyId, String secretAccessKey) {
        return new OSSClient(endpoint, getDefaultCredentialProvider(accessKeyId, secretAccessKey),getClientConfiguration());
    }

调用了getDefaultCredentialProvider方法 返回了一个DefaultCredentialProvider对象

private static DefaultCredentialProvider getDefaultCredentialProvider(String accessKeyId, String secretAccessKey) {
        return new DefaultCredentialProvider(accessKeyId, secretAccessKey);
    }

(2)DefaultCredentialProvider类 看看这个类有啥,最终调用了第二个重载方法

    public DefaultCredentialProvider(String accessKeyId, String secretAccessKey) {
        this(accessKeyId, secretAccessKey, null);
    }

    public DefaultCredentialProvider(String accessKeyId, String secretAccessKey, String securityToken) {
        checkCredentials(accessKeyId, secretAccessKey);
        setCredentials(new DefaultCredentials(accessKeyId, secretAccessKey, securityToken));
    }

(3)checkCredentials方法 判断ak和sk是否为空,为空就抛出异常

private static void checkCredentials(String accessKeyId, String secretAccessKey) {
        if (accessKeyId == null || accessKeyId.equals("")) {
            throw new InvalidCredentialsException("Access key id should not be null or empty.");
        }

        if (secretAccessKey == null || secretAccessKey.equals("")) {
            throw new InvalidCredentialsException("Secret access key should not be null or empty.");
        }
    }

(4)DefaultCredentials类 这个类比较简单。三个私有属性和几个get方法 这里的构造方法又判断一次ak,sk是否为空

public DefaultCredentials(String accessKeyId, String secretAccessKey, String securityToken) {
        if (accessKeyId == null || accessKeyId.equals("")) {
            throw new InvalidCredentialsException("Access key id should not be null or empty.");
        }
        if (secretAccessKey == null || secretAccessKey.equals("")) {
            throw new InvalidCredentialsException("Secret access key should not be null or empty.");
        }

        this.accessKeyId = accessKeyId;
        this.secretAccessKey = secretAccessKey;
        this.securityToken = securityToken;
    }

(5)--->setCredentials方法 这里面传了一个DefaultCredentials对象,此类继承了Credentials类 然后判断这个对象是否为空, 然后又又调用了一次checkCredentials判断ak,sk是否为空 最后将这个对象赋值给自身成员属性 private volatile Credentials creds;


    @Override
    public synchronized void setCredentials(Credentials creds) {
        if (creds == null) {
            throw new InvalidCredentialsException("creds should not be null.");
        }

        checkCredentials(creds.getAccessKeyId(), creds.getSecretAccessKey());
        this.creds = creds;
    }

最终,getDefaultCredentialProvider方法返回了一个DefaultCredentialProvider对象

现在可以回到第一行代码的build函数了