Использование Jersey с Spring Boot

Sep 15 2020

В справочной документации по загрузке Spring в разделе 7.3 JAX-RS и Джерси упоминается: « Все зарегистрированные конечные точки должны быть @Components с аннотациями ресурсов HTTP (@GET и другие). Поскольку конечная точка является Spring @Component, ее жизненный цикл управляется Spring и вы можете использовать аннотацию @Autowired для внедрения зависимостей и использовать аннотацию @Value для внедрения внешней конфигурации ".

Но я не хочу вводить зависимости или внешнюю конфигурацию, вводимую в мои ресурсы Джерси, и поэтому я не аннотировал свои ресурсы Джерси как @Components. Мое приложение работает нормально.

Из прочтения справочной документации по загрузке Spring показалось, что регистрация ресурсов Джерси как @Components была обязательной. Но похоже, что это не так. Мне это кажется небольшой ошибкой в ​​справочной документации Spring Boot. Возможно, документация может быть обновлена ​​с « зарегистрированные конечные точки должны быть @Components » на « зарегистрированные конечные точки могут быть @Components ». Имеет ли это смысл?

Ответы

RahulKhimasia Sep 17 2020 at 04:29

Я попробовал это и обнаружил, что аннотирование ресурса Джерси с помощью аннотации Spring @Component необязательно. Если вы используете эту аннотацию, тогда жизненным циклом ресурса будет управлять Spring, а если вы НЕ используете эту аннотацию, тогда жизненным циклом будет управлять Джерси.

Следует отметить одну важную вещь: есть большая разница в том, как этот жизненный цикл программируется по умолчанию между ними.

Как указано в разделе 3.4 на пользователе Джерси Руководства " По умолчанию жизненного цикла корневых классов ресурсов является каждым запрос , который, в частности , что новый экземпляр класса корневого ресурса создается каждый раз , когда запрос URI путь совпадает с корневым ресурсом. Это создает очень естественную модель программирования, в которой конструкторы и поля могут использоваться, не беспокоясь о множественных одновременных запросах к одному и тому же ресурсу. В общем, это вряд ли будет причиной проблем с производительностью. Создание классов и сборка мусора JVM значительно улучшились годы и многие объекты будут созданы и отброшены для обслуживания и обработки HTTP-запроса и возврата HTTP-ответа ».

Но, как указано в разделе 1.5 документации Spring Framework ; beans по умолчанию - singleton. « Контейнер Spring IoC создает ровно один экземпляр объекта, определенного этим определением компонента. Этот единственный экземпляр хранится в кеше таких одноэлементных компонентов, и все последующие запросы и ссылки для этого именованного компонента возвращают кэшированный объект ».

Следовательно, есть разница. Обычные классы корневых ресурсов Джерси по умолчанию создаются для каждого запроса, в то время как в Spring, когда ресурс аннотируется с помощью @Component, он будет одноэлементным. т.е. только один экземпляр за все время существования JVM. Если вы хотите, чтобы ресурсы, управляемые Spring, имели тот же жизненный цикл для каждого запроса, что и обычные ресурсы Джерси, вам следует добавить @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)аннотацию Spring в дополнение к аннотации @Component. Добавив его, ваш жизненный цикл ресурса теперь будет зависеть от запроса.