我有1000多个服务,我正在对这些服务进行改进/清理,以便将它们的实现复杂性抽象出来。然而,我注意到的是,java没有提供基于单例的SPI设置。相反,它为如何在处理基于SPI的服务时实现这一目标提供了指导。
https://docs.oracle.com/javase/tutorial/ext/basics/spi.html#singleton
以下代码
ServiceProvider sp = ServiceLoader.load(ProvierAPI.class).iterator().next()
每次查询ServiceProvider时都会加载ServiceLoader的一个新实例。但是,我不太确定它是,而不是,这是一种内存安全操作,因为下面的代码将确保在上下文离开堆栈帧后发生垃圾回收。
public void doFoo() {
ServiceProvider sp = ServiceLoader.load(ProvierAPI.class).iterator().next();
sp.doServiceFoo();
doSomethingElse();
return;
}使用单身者“真的”在这里有什么好处吗?据我所知,Singleton在技术上意味着内存中的许多永久对象引用(所谓的静态getInstance() )。
使用Singleton的SPI相关实现更好吗?
发布于 2019-06-12 18:50:02
IMHO将问题减少到内存需求,忽略了重要的方面。
ServiceLoader.load(ProvierAPI.class).iterator().next()每次运行此代码时,ServiceLoader都必须查找和读取提供程序配置文件,这意味着检查类路径上的所有jar文件,以检查提供程序配置文件。
光是这一点就会对性能产生一定的影响。
另一点是服务提供者在实例化时所做的事情。如果他们只是创建一个Map并用几个值填充它,那么什么都不会发生。
但是,假设一个字典服务在每次实例化服务时从一个文件中读取数千个单词的字典及其定义。当然,您更喜欢这样做一次,而不是每次用户在TextArea中的某个单词上悬停鼠标光标时。
最后,这在很大程度上取决于您的服务提供者以及它们是如何实现的。
https://stackoverflow.com/questions/56555188
复制相似问题