这个项目中的自动装配用了一种我从来没见过的形式: 所以记录一下, 以免遗忘

配置

借助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

结构

结构