如何在 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);
}
}
正在 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);
}
}