目前,我的代码如下
@Service
public class MyFileService {
private StandardFileSystemManager manager = new StandardFileSystemManager();
public List<FileObject> listRemoteFiles() {
try {
manager.init();
manager.resolveFile(someURL);
} finally {
manager.close();
}
return Arrays.stream(remoteFiles)
.collect(Collectors.toList());
}
}
但是我发现有时manager.init()会因为多次注册而抛出异常
FileSystemException :Multiple providers registered for URL scheme "file".
是否有创建此 StandardFileSystemManager 的最佳实践?所以它只注册 1 个提供商?
我猜每次我调用 listRemoteFiles() 时它都会初始化管理器。但我打算初始化一次并在最后关闭。 这可能吗?
最佳答案
您可以使用单例设计模式来确保仅创建一个 StandardFileSystemManager
对象。
我看到您正在使用@Service
注释。我假设它来自 Spring 。为什么不将 StandardFileSystemManager
注册为 spring bean,然后在 MyFileService
中 Autowiring 它?默认情况下 Spring Bean 是单例的。所以你的代码看起来像
@Service
public class MyFileService {
private final StandardFileSystemManager manager;
@Autowired
public MyFileService(StandardFileSystemManager manager) {
this.manager = manager;
}
public List<FileObject> listRemoteFiles() {
try {
manager.resolveFile(someURL);
} finally {
manager.close();
}
return Arrays.stream(remoteFiles)
.collect(Collectors.toList());
}
}
并且您可以将 StandardFileSystemManager
注册为任何用 @Configuration
标记的类中的 bean,如下所示
@Bean
public StandardFileSystemManager manager() {
StandardFileSystemManager manager = new StandardFileSystemManager();
manager.init();
return manager;
}
关于java - 初始化 StandardFileSystemManager 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203223/