oss对象存储
在学到这块时,很多弹幕都说为什么要额外添加如下代码
package com.sky.config;
import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类,用于创建AliOssUtil对象
*/
@Configuration
@Slf4j
public class OssConfiguration {
@Bean
@ConditionalOnMissingBean
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
目的,将属性和方法都写好,生成bean类交给容器管理,这时候开发者只需要调用Util中的方法就行,便于开发者使用。
疑虑:
为什么之前的jwt工具类不这样呢?
于是我参考了之前jwt代码,并改写成上面格式,发现jwt为什么不按照上面方法写:
首先在JwtProperties中属性有两种,管理端和客户端,
/**
* 管理端员工生成jwt令牌相关配置
*/
private String adminSecretKey;
private long adminTtl;
private String adminTokenName;
/**
* 用户端微信用户生成jwt令牌相关配置
*/
private String userSecretKey;
private long userTtl;
private String userTokenName;
然后他们使用同一个方法进行生成jwt
public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
// 指定签名的时候使用的签名算法,也就是header那部分
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 生成JWT的时间
long expMillis = System.currentTimeMillis() + ttlMillis;
Date exp = new Date(expMillis);
// 设置jwt的body
JwtBuilder builder = Jwts.builder()
// 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
.setClaims(claims)
// 设置签名使用的签名算法和签名使用的秘钥
.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
// 设置过期时间
.setExpiration(exp);
return builder.compact();
}
假设我们将所有属性和,方法放在一起封装成bean类,如下:
JWT工具类
package com.sky.config;
import com.sky.properties.JwtProperties;
import com.sky.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类,直接将jwtUtil工具类交给容器管理
*/
@Configuration
@Slf4j
public class JwtConfiguration {
@Bean
@ConditionalOnMissingBean//如果Bean容器内没有该对象,就会将该返回的对象添加到容器中,否则不加入
public JwtUtil jwtUtil(JwtProperties jwtProperties){
log.info("开始创建jwt对象: {}",jwtProperties);
return new JwtUtil(jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
jwtProperties.getAdminTokenName(),
jwtProperties.getUserSecretKey(),
jwtProperties.getUserTtl(),
jwtProperties.getUserTokenName());
}
}
那么我在使用时,只需调用方法即可,但是问题来了,我有电脑端和手机端,那你得提供我两个方法,但是呢生成jwt代码逻辑一样的,所以为了减少代码量,我们提供一个通用的方法,在方法中通过你传递的参数去执行。
总结:
oss之所以需要增加一个配置类,因为开发者不需要使用到配置属性,所以统一封装简便开发者使用。
jwt:因为在使用jwt中需要使用配置属性,所以不将属性和方法杂糅在一起。