如何在 Spring Boot 中通过本机库正确连接到外部服务

How to properly connect to external service via native library in Spring Boot

正在 Spring 启动并希望使用本机库以连接和使用外部存储系统。我下载了 JAR 文件和 dll 文件,通过 Maven 导入了 JAR。现在我想创建一个 Bean 来充当 @Service 并具有基本功能:上传、下载等。

所以看起来像这样:

@Service
public class StorageSystemClient {

  private NativeLibrary nativeLibrary;

  public StorageSystemClient() {
    String url = "...";
    this.nativeLibrary = NativeLibraryConnector.connect(url);
  }

  public File downloadFile(String filename) {
    return this.nativeLibrary.download(filename);
  }

}

问题: 这里我不喜欢的是 StorageSystemClient 构造函数中的连接过程。

问题:执行此连接一次的正确方法应该是什么,例如在 bean 初始化阶段?

我认为您可以将 PostConstruct

之类的东西一起使用
  @PostConstruct
  private void init() {
    //establish connection 
  }

在 bean 构造之后,它完全是为 运行 初始化代码制作的。

我认为您使用本机库这一事实在这里并不重要。

是我推荐的解决方案,从StorageSystemClient中排除连接逻辑并让spring处理它。这样 StorageSystemClient 将变得可单元测试并且总体上清晰。

NativeLibrary 将由 spring 管理。

您可能会得到以下代码:

@Configuration
public void NativeLibraryConfig {
   @Bean
   public NativeLibrary nativeLibrary() {
     String url = "..."; // can be externalized to configuration, or whatever you need,
     // in any case StorageSystemClient should not resolve the url by itself
     return NativeLibraryConnector.connect(url);
   }
}

@Service
public class StorageSystemClient {

  private NativeLibrary nativeLibrary;

  public StorageSystemClient(NativeLibrary nativeLibrary) {
    this.nativeLibrary = nativeLibrary;
  }

  public File downloadFile(String filename) {
    return this.nativeLibrary.download(filename);
  }
}

只需使用依赖注入。 NativeLibraryConnector.connect(url); 只是一个工厂方法。

@Bean
public NativeLibrary nativeLibrary(String url) {
  return NativeLibraryConnector.connect(url);
}
@Service
public class StorageSystemClient {

  private final NativeLibrary nativeLibrary;

  public StorageSystemClient(NativeLibrary nativeLibrary) {
    this.nativeLibrary = this.nativeLibrary;
  }

  public File downloadFile(String filename) {
    return this.nativeLibrary.download(filename);
  }

}