Usando Jersey com Spring Boot

Sep 15 2020

A documentação de referência do Spring Boot na seção 7.3 JAX-RS e Jersey menciona " Todos os endpoints registrados devem ser @Components com anotações de recurso HTTP (@GET e outros). Como o Endpoint é um Spring @Component, seu ciclo de vida é gerenciado pelo Spring e você pode usar a anotação @Autowired para injetar dependências e usar a anotação @Value para injetar configuração externa ".

Mas eu não me importo em ter dependências injetadas ou configurações externas injetadas em meus recursos de Jersey e, portanto, não anotei meus recursos de Jersey como @Components. Meu aplicativo funciona bem.

Ao ler a Documentação de referência do Spring Boot, parecia que registrar os recursos do Jersey como @Components era um requisito. Mas não parece ser o caso. Para mim, isso parece um pequeno bug na Documentação de Referência do Spring Boot. Pode ser que a documentação possa ser atualizada de " endpoints registrados devem ser @Components " para " endpoints registrados podem ser @Components ". Isso faz sentido?

Respostas

RahulKhimasia Sep 17 2020 at 04:29

Eu tentei fazer isso e descobri que anotar um recurso Jersey com a anotação Spring @Component é opcional. Se você usar essa anotação, o ciclo de vida do recurso será gerenciado pelo Spring e se você NÃO usar essa anotação, o ciclo de vida será gerenciado por Jersey.

Uma coisa importante a se notar é que há uma grande diferença em como esse ciclo de vida é programado por padrão entre os dois.

Conforme declarado na seção 3.4 do Guia do Usuário de Jersey " Por padrão, o ciclo de vida das classes de recursos raiz é por solicitação, ou seja, uma nova instância de uma classe de recurso raiz é criada toda vez que o caminho do URI da solicitação corresponde ao recurso raiz. Isso cria um modelo de programação muito natural, em que construtores e campos podem ser utilizados sem preocupação com várias solicitações simultâneas para o mesmo recurso. Em geral, é improvável que isso seja uma causa de problemas de desempenho. A construção de classes e a coleta de lixo de JVMs melhoraram muito. os anos e muitos objetos serão criados e descartados para atender e processar a solicitação HTTP e retornar a resposta HTTP. "

Mas conforme declarado na seção 1.5 da documentação do Spring Framework ; os grãos por padrão são singleton. " O contêiner Spring IoC cria exatamente uma instância do objeto definido por aquela definição de bean. Esta instância única é armazenada em um cache de tais beans singleton e todas as solicitações e referências subsequentes para aquele bean nomeado retornam o objeto em cache. "

Portanto, há uma diferença. Por padrão, as classes normais de recursos raiz Jersey são instanciadas por solicitação, enquanto com Spring, quando um recurso é anotado com @Component, ele será um único. ou seja, apenas uma instância durante o tempo de vida da JVM. Se desejar que os recursos gerenciados do Spring tenham o mesmo ciclo de vida por solicitação que vem com os recursos normais do Jersey, você deve adicionar a @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)anotação Spring além da anotação @Component. Ao adicioná-lo, o ciclo de vida do seu recurso agora será por solicitação.