Spring:应该在启动时初始化的Singleton

时间:2016-12-26 15:55:25

标签: java spring spring-boot singleton startup

我有一个Spring(Boot)应用程序,可以执行一些繁重的NLP文本处理。我正在寻找一种通过预先加载一些模型来优化性能的方法。

方案

有一个@Service由几种分析文本的方法组成(例如提取关键字)。预训练的模型将由我在我的服务中使用的NLP框架加载,这需要大量的时间和内存。模型可以重复使用,因此无需每次都加载它们。最有效的方法是加载一次并将它们保存在内存中。您还可以假设模型是线程安全的。

问题

在启动时定义单例并初始化一次的最佳方法是什么?

现在我在我的服务上使用@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)但是根据我的理解,无法保证在启动时初始化服务。我还尝试了@Configuration,但没有找到解决方案。

4 个答案:

答案 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?