java使用S3协议通过dfs实现Spring的SPI机制和spring.factories

java使用S3协议通过dfs实现Spring的SPI机制和spring.factories

目录

参考

1、SPI机制

1、什么是SPI

SPI 的全称是Service Provider Interface,即提供服务接口;是一种服务发现机制,SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。

2、使用场景?

数据库驱动加载接口实现类的加载;如:JDBC 加载Mysql,Oracle… 日志门面接口实现类加载,如:SLF4J 对log4j、logback 的支持 Spring中大量使用了SPI,特别是spring-boot 中自动化配置的实现 Dubbo 也是大量使用SPI 的方式实现框架的扩展,它是对原生的SPI 做了封装,允许用户扩展实现Filter 接口。

3、使用介绍

要使用 Java SPI,需要遵循以下约定:

当服务提供者提供了接口的一种具体实现后,需要在JAR 包的META-INF/services 目录下创建一个以“接口全限制定名”为命名的文件,内容为实现类的全限定名; 接口实现类所在的JAR放在主程序的classpath 下,也就是引入依赖。 主程序通过java.util.ServiceLoder 动态加载实现模块,它会通过扫描META-INF/services 目录下的文件找到实现类的全限定名,把类加载值JVM,并实例化它; SPI 的实现类必须携带一个不带参数的构造方法。

4、代码演示

新建工程edevp-dfs-api的spi接口

package com.edevp.dfs.api;

/**
 * @create 2023-04-11
 */
public interface DfsService {
   
    /**
     * 创建bucket
     * @param bucketName 存储桶
     */
    void createBucket(String bucketName);
    /**
     * 判断存储桶是否存在
     * @param bucketName 存储桶
     */
    default boolean doesBucketExist(String bucketName){
   return true;}
    /**
     * 初始化
     */
    void init();
}

新建阿里云oss实现类

public class OssServiceImpl implements DfsService {
   

    @Override
    public void createBucket(String bucketName) {
   
        if (!amazonS3.doesBucketExistV2(bucketName)) {
   
            amazonS3.createBucket((bucketName));
        }
    }
    public boolean doesBucketExist(String bucketName){
   
        return enable && amazonS3.doesBucketExistV2(bucketName);
    }

    @PostConstruct
    @Override
    public void init() {
   
        System.out.println("oss");
    }
}

在resource下新建/META-INF/services/com.edevp.dfs.api.DfsService的文件,内容如下:

com.edevp.dfs.impl.OssServiceImpl

www.zeeklog.com  - java使用S3协议通过dfs实现Spring的SPI机制和spring.factories

新建minio实现类

public class MinioServiceImpl implements DfsService {
   
    @Override
    public void createBucket(String bucketName) {
   
        System.out.println("minio");
    }

    @Override
    public boolean doesBucketExist(String bucketName) {
   
        return false;
    }

    @Override

Read more

LibreChat 集成 Stripe 支付的奶妈级教程

LibreChat 集成 Stripe 支付的奶妈级教程

我们假设你已经熟悉基本的 React 和 Node.js 开发,并且正在使用 LibreChat 的默认技术栈(React 前端、Node.js 后端、Vite 构建工具,可能还有 Electron 桌面应用)。教程会特别考虑 Electron 环境下的适配问题(例如 macOS 中文路径或路由错误)。“奶妈级”带你从零开始实现支付功能(包括一次性支付和添加高级会员订阅) 教程目标 * 在 LibreChat 中添加支付页面,支持用户通过信用卡付款。 * 实现 Stripe 的一次性支付功能。 * (可选)扩展到订阅功能,管理高级会员状态。 * 解决 Electron 环境下的常见问题(如路由和路径解析)。 * 生成可公开推送的 Markdown 教程,方便社区参考。 前提条件 在开始之前,请确保你已准备好以下内容:

By Ne0inhk
超棒的雅思资源!

超棒的雅思资源!

雅思真题材料地址: https://github.com/zeeklog/IETLS 感谢所有人。材料来自:@shah0150 & @kbtxwer * 超棒的雅思资源 * 雅思简介 * 听力 * 阅读 * 写作 * 口语 * 词汇 * 其他 * YouTube 频道 * [播客] (#podcasts) 雅思简介 * 什么是雅思 - 了解什么是雅思 听力 * 高级听力 * 雅思官方网站 * 考试英语 * 英国广播公司节目 * 乔治梅森大学口音学习网站 - 学习不同的口音 * 英国广播公司播客 * 英国文化协会听力练习 阅读 * 雅思提升阅读 写作 * 雅思提升写作 * 雅思从 6 分到 9 分 * 迷你雅思 口语 * Verbling 提供在线英语家教服务

By Ne0inhk