我有一个Spring(Boot)应用程序,可以执行一些繁重的NLP文本处理。我正在寻找一种通过预先加载一些模型来优化性能的方法。
有一个@Service
由几种分析文本的方法组成(例如提取关键字)。预训练的模型将由我在我的服务中使用的NLP框架加载,这需要大量的时间和内存。模型可以重复使用,因此无需每次都加载它们。最有效的方法是加载一次并将它们保存在内存中。您还可以假设模型是线程安全的。
在启动时定义单例并初始化一次的最佳方法是什么?
现在我在我的服务上使用@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
但是根据我的理解,无法保证在启动时初始化服务。我还尝试了@Configuration
,但没有找到解决方案。
答案 0 :(得分:2)
FactoryBeans可以支持单身人士和原型,可以根据需要懒散地创建对象,也可以在启动时急切地创建。
答案 1 :(得分:1)
在服务的某个方法上使用@PostConstruct注释,并在创建实例后调用它。
答案 2 :(得分:1)
在Spring Core中,当您将类声明为bean时,它的默认范围是Singleton。当您启动应用程序时,Spring尝试初始化该类。如果存在依赖关系,则首先初始化依赖关系,然后初始化类。在我看来,你不应该使用范围。
@Service
public class Foo {
}
这足以创建在启动时初始化的bean。
对不起,如果我不明白的话。
祝你好运, 斯托。
答案 3 :(得分:0)
据我所知,如果您使用“@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)”,那么您的服务将在启动时初始化。有关更多信息,请参阅以下帖子: @Singleton @Startup fully Asynchronous?