1、Java类型问题:全限定名和简单类名
在Java开发中,遇到类似com.aliyun.ocr_api20210707.Client(全限定名)与Client(简单类名)的类型差异,本质是包(Package)机制和类型作用域的体现。
全限定名(Fully Qualified Name)
格式:包名.类名,如:
com.aliyun.ocr_api20210707.Client
作用:全局唯一标识类,避免命名冲突。例如,不同厂商的Client类可通过包名区分。
使用场景:跨模块或第三方库调用时,或者反射时,需显式指定全限定名
简单类名(Simple Class Name)
格式:仅类名,如
Client
作用:在当前作用域内简化代码。
限制:需通过import语句导入全限定名,否则编译器无法识别。
区别
全限定名是类的全局唯一标识,简单类名需配合import使用。
类型声明影响编译器检查,实际执行由运行类型决定(多态)。
包机制是Java模块化的基石,避免命名冲突并控制访问权限。
2、SLF4J(Simple Logging Facade for Java)
SLF4J是Java生态中广泛使用的日志门面框架,其核心作用是为不同日志系统(如Logback、Log4j等)提供统一的编程接口。
统一日志接口SLF4J本身不实现日志功能,而是定义标准接口(如Logger、LoggerFactory),开发者通过其API编写日志代码,无需关心底层日志框架的具体实现。比如说:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
private static final Logger logger = LoggerFactory.getLogger(Demo.class);
public void run() {
logger.info("This is a log message");
}
}
此代码可无缝适配Logback、Log4j2等日志框架。
解耦与灵活性方面,可以避免绑定特定日志框架:业务代码仅依赖SLF4J接口,更换日志实现时无需修改源码,只需调整依赖配置。另外,也可以解决依赖冲突:若第三方库使用不同日志框架(如A库用Log4j,B库用JUL),SLF4J可通过桥接器(如jcl-over-slf4j)统一路由日志输出,避免多套日志并存。
3、管理访问凭据——阿里云Credentials工具使用过程
作用:统一管理访问阿里云资源的认证凭证(如AccessKey、STS Token等),确保API调用的安全性。硬编码的解决方案之一。
凭证类型支持:
永久凭证:主账号或RAM用户的AccessKey(AK),含AccessKeyId和AccessKeySecret。
临时凭证:STS Token(自定义时效与权限)、ECS实例RAM角色凭证(通过元数据服务自动获取)。
其他类型:RAM角色ARN(通过AssumeRole生成STS)、OIDC角色(用于容器服务RRSA)、Bearer Token(特定产品如云呼叫中心)。
安全机制:
禁止代码硬编码AK,推荐通过环境变量、配置文件或安全URI动态注入凭证。
支持最小权限策略(Policy)和外部ID(ExternalId),防止权限滥用。
配置参数与初始化
核心模型:
- 通过Config对象定义凭证类型及相关参数(如accessKeyId、roleArn等)。
- 参数按凭证类型差异化支持(例如ram_role_arn需roleArn,ecs_ram_role需roleName)。
初始化方式:
- 默认凭证链:不传参时按优先级检索凭证(系统属性 > 环境变量 > 配置文件)。
- 显式配置:通过Config对象指定类型及参数。
- 单例模式推荐:避免重复请求STS服务,启用凭证缓存与自动刷新。
当初始化凭据客户端不传入任何参数时,Credentials工具会使用默认凭据链方式初始化客户端。
import com.aliyun.credentials.Client;
public class DemoTest {
public static void main(String[] args) throws Exception{
// 不指定参数
Client credentialClient = new Client();
// 省略使用credentialClient初始化云产品客户端内容...
}
}
另一种方式是使用AK:
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class DemoTest {
public static void main(String[] args) throws Exception{
Config credentialConfig = new Config();
credentialConfig.setType("access_key");
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Client credentialClient = new Client(credentialConfig);
// 省略使用credentialClient初始化云产品客户端内容...
}
}
等等。
后面的还没涉及到。