可能在启动时未加载Servlet的重复项,但是我还没有评论,所以我必须为此提出一个新问题…
相同的设置,有一个使用Jersey和Tomcat的servlet,并使用启动时加载来加载容器。但是,由于上面提到的线程,我知道这只会加载Jersey容器,而不加载我为servlet设置的类。
因此,与上述线程的答案中所隐含的内容有关,如何做到的是,不仅在启动时加载了包含的内容,而且还添加了用@Path注释的我的类(例如,它将从内存中的DB加载数据) 。
@Singleton @Path( "156846986" ) public class SearchEngine { @Inject private DatabaseService dbService; @Inject private PatriciaTrieEngine trieEngine; }
例如:
@Singleton @Path( "3455470640" ) public class PatriciaTrieEngine { @Inject DatabaseService dbService; private PatriciaTrie< Object > patriciaTrie; @PostConstruct public void init( ) throws SQLException { ...some code initializing the trie by loading data from a database u using dbService }
}
最后,有些类例如SearchService具有请求的端点:
SearchService
@Path( "/search" ) @Produces( "application/json" ) public class SearchService { @Inject private DatabaseService dbService; @Inject private SearchEngine engine; @GET @Path( "/candidates" ) public Response getCandidates(@QueryParam( "query" ) final String input) throws UnsupportedEncodingException { use Patricia trie via SearchEngine in order to find candidates for given query return Response.ok().entity( candidates ).build(); }
最终是应该在启动时加载PatriciaTrie,因为将数据加载到trie需要花费几分钟。
默认行为是为每个请求实例化资源类的新实例。在这种情况下,不需要在启动时加载。如果您想要这种行为,则您的资源类需要为单例,这意味着为整个应用程序仅创建一个实例。如果这样做,则有责任使类线程安全。
在泽西1,可以使类与一个单身@Singleton注释,提到这里。这也将在启动时加载该类。在Jersey 2中,@Singleton注释将使资源类成为单例,但在启动时不会加载。
@Singleton
除此之外,仅从您的描述来看,这对我来说似乎是需要修复设计的需求。如果看不到要尝试执行的代码,就无法真正分辨。