这个项目中的自动装配用了一种我从来没见过的形式: 所以记录一下, 以免遗忘
配置
借助application.yml配置在每个模块中都可能不同的 配置项
tanhua:
sms:
topic: 探花交友
oss:
access-key: LTAI5tEghufvuasvfuDb5fYt5
secret: 9PX0GubfvsbfviO0tbvQdIK
endpoint: oss-cn-chengdu.aliyuncs.com
bucket-name: thjy
url: https://thjy.oss-cn-chengdu.aliyuncs.com
aip:
app-id: 116222251
api-key: pwSEvbnsudvbUjl4KqlWlM1M
secret-key: Z6MzuvgsdagvbixdGFf2r
读取配置
在 autoConfig模块 中的 properties软件包 下创建配置读取类
package com.tanhua.autoconfig.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "tanhua.oss")
public class OssProperties {
private String accessKey;
private String secret;
private String bucketName;
private String url; //域名
private String endpoint;
}
还需要在这个类的启动类上加入注解 @EnableConfigurationProperties
否则读取不会生效
@EnableConfigurationProperties({
SmsProperties.class,
OssProperties.class,
AipFaceProperties.class
})
Template
template中, 将properties的引入是通过 构造方法 而非自动注入. 可能这样才能让Spring容器中存在不一样的properties? 反正情况就这么个情况, 具体怎么回事我也不懂
package com.tanhua.autoconfig.template;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.tanhua.autoconfig.properties.OssProperties;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Slf4j
public class OssTemplate {
private OssProperties properties;
public OssTemplate(OssProperties properties) {
this.properties = properties;
}
/**
* 文件上传
* 1.文件名称
* 2.字节缓冲输入流
*/
public String upload(String filename, BufferedInputStream bis) {
//filename:用户上传上来的图片名(1.jpg)
//fileName:阿里云oss存的图片名字(2024/11/13/1c546bd0-78a1-48bb-a6ef-96a3f6b82740.jpg)
//构造图片在oss中存放的路径
String fileName = new SimpleDateFormat("yyyy/MM/dd/")
.format(new Date()) + UUID.randomUUID().toString() + filename.substring(filename.lastIndexOf("."));
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = properties.getEndpoint();
// 阿里云主账号的AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = properties.getAccessKey();
String accessKeySecret = properties.getSecret();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
ossClient.putObject(properties.getBucketName(), fileName, bis);
// 关闭OSSClient。
ossClient.shutdown();
String url = properties.getUrl() +"/" + fileName;
return url;
}
}
自动注入template
这步需要用到 自动装配模块 的启动类
package com.tanhua.autoconfig;
import com.tanhua.autoconfig.properties.AipFaceProperties;
import com.tanhua.autoconfig.properties.OssProperties;
import com.tanhua.autoconfig.properties.SmsProperties;
import com.tanhua.autoconfig.template.AipFaceTemplate;
import com.tanhua.autoconfig.template.OssTemplate;
import com.tanhua.autoconfig.template.SmsTemplate;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties({
SmsProperties.class,
OssProperties.class,
AipFaceProperties.class
})
public class TanHuaAutoConfiguration {
@Bean
public SmsTemplate smsTemplate(SmsProperties smsProperties) {
return new SmsTemplate(smsProperties);
}
@Bean
public OssTemplate ossTemplate(OssProperties ossProperties) {
return new OssTemplate(ossProperties);
}
@Bean
public AipFaceTemplate aipFaceTemplate(AipFaceProperties aipFaceProperties) {
return new AipFaceTemplate(aipFaceProperties);
}
}
主要是通过 @Bean
注解做到的
配置自动装配
resources -> META-INF -> spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.tanhua.autoconfig.TanHuaAutoConfiguration