Без аннотации @Repository код работает нормально, и с аннотацией также работает нормально. В чем разница?

#spring-boot

Вопрос:

мы можем объявить классы репозитория таким образом

 public interface DepartmentRepository extends JpaRepository<Department, Integer>
 

и вот так

 @Repository
public interface DepartmentRepository extends JpaRepository<Department, Integer>
 

В чем разница между этими двумя упомянутыми подходами. Потому что если мы удалим @Repository аннотацию, то код будет работать нормально, тогда в чем разница, может ли кто-нибудь объяснить мне это.

Комментарии:

1. В интерфейсе нет @Repository ничего, что не делает, и у Spring Data есть другие средства обнаружения компонентов.

Ответ №1:

В то время как другие ответы подробно описывают аннотации к стероидам, они не документируют, почему именно это не нужно, это функция загрузки Spring, а не фреймворк Spring.

С помощью Spring Boot он автоматически сканирует дочерние пакеты из основного класса SpringBootApplication, обнаруживает интерфейсы репозитория и создает компоненты для вас с помощью автоконфигурации, которая является частью SpringBootApplication

Хранилища данных Spring обычно выходят из интерфейсов репозитория или хранилища данных. Если вы используете автоматическую настройку, поиск в репозиториях выполняется из пакета, содержащего ваш основной класс конфигурации (тот, который помечен @EnableAutoConfiguration или @SpringBootApplication), вниз.

https://docs.spring.io/autorepo/docs/spring-boot/current/reference/htmlsingle/#boot-features-spring-data-jpa-repositories

Если вы не использовали Spring Boot, или репозиторий не был в пакете или дочернем пакете приложения Spring Boot, его необходимо будет аннотировать и сканировать пакет или создать компонент.

Spring Data может создавать реализации интерфейсов @Repository различных типов. Spring Boot обрабатывает все это за вас, если эти @Репозитории включены в один и тот же пакет (или подпакет) вашего класса @EnableAutoConfiguration.

Для многих приложений все, что вам нужно, — это поместить правильные зависимости данных Spring в свой путь к классам. Есть spring-boot-starter-data-jpa для JPA, spring-boot-starter-data-mongodb для Mongodb и т. Д. Для начала создайте некоторые интерфейсы репозитория для обработки объектов @Entity.

Spring Boot пытается угадать местоположение ваших определений @репозитория на основе найденной конфигурации @EnableAutoConfiguration. Чтобы получить больше контроля, используйте аннотацию @EnableJpaRepositories (из JPA Spring Data).

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

https://docs.spring.io/autorepo/docs/spring-boot/current/reference/htmlsingle/#howto-use-spring-data-repositories

Комментарии:

1. вы случайно не пробовали это сделать? потому что ты ошибаешься. Я не знаю, как вы поняли эти строки в документации по spring-boot, но @Repository в интерфейсе значение равно НУЛЮ для spring-boot, оно может быть в одном пакете (или дочернем) или в совершенно не связанном пакете (с @ComponentScan и @EnableJpaRepositories ). Опять же : не имеет значения, используете ли вы @Repository интерфейс.

2. Я не уверен, что понял ваш комментарий, я считаю, что это то, что я сказал.

3. Если вы не использовали Spring Boot или репозиторий находился в дочернем пакете, его необходимо было бы аннотировать и отсканировать пакет

4. Я не понимаю вашего редактирования сейчас, так как вы оставили странное или репозиторий не был в пакете , что вроде как не имеет смысла. Но в любом случае, это все равно неверно.

5. правильно! @Repository На интерфейсе это не нужно, никогда 🙂

Ответ №2:

Взято из весенней документации:

Аннотация @Repository является маркером для любого класса, который выполняет роль или стереотип репозитория (также известный как Объект доступа к данным или DAO). Среди применений этого маркера-автоматический перевод исключений, как описано в разделе Перевод исключений.

Он служит в основном в качестве маркера стереотипа, но @Repository-это специализация @Component, которую spring использует для сканирования путей к классам.

https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-stereotype-annotations

https://www.journaldev.com/21460/spring-repository-annotation

Комментарии:

1. Это не объясняет, почему это не нужно.

2. Это зависит от вашей настройки, если у вас есть Компонент или служба в согласовании с Репозиторием, вам не нужно будет его определять, но вам нужно иметь одну из трех аннотаций, чтобы автоматически подключаемые пружины работали, так как эти аннотации создают для вас компоненты. Если в вашем приложении есть другой механизм для создания компонентов из интерфейсов реализации JpaRepository, то, конечно, он будет работать без аннотаций, в противном случае вы должны были получить ошибку «компонент не найден» при сборке.

3. Это связано с весенней загрузкой интерфейса.

Ответ №3:

@Repository аннотация используется для указания на то, что класс предоставляет механизм для хранения, извлечения, поиска, обновления и удаления объектов.

Аннотация Spring репозитория y является специализацией аннотации @Component, поэтому классы репозитория Spring автоматически определяются spring framework путем сканирования путей к классам.

@Репозиторий используется для создания компонента. Если вы не используете эту аннотацию, то может быть какой-то другой способ создания компонента, поэтому для вас это не имеет никакого значения.

Ответ №4:

@Repository это особый тип @Component , и мы аннотируем интерфейс, который действует как хранилище с @Repository аннотациями. @Repository имеет дело с перехватом исключений, связанных с сохранением данных.

Нам не нужно использовать @Repository аннотации при расширении JpaRepository , потому что Spring обнаруживает, что предопределенное JpaRepository было расширено, и распознает интерфейс, который расширяется JpaRepository как хранилище.