#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), вниз.
Если вы не использовали 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).
Смотрите документацию для получения дополнительной информации об этом поведении, например, для получения большего контроля над созданием репозиториев.
Комментарии:
1. вы случайно не пробовали это сделать? потому что ты ошибаешься. Я не знаю, как вы поняли эти строки в документации по spring-boot, но
@Repository
в интерфейсе значение равно НУЛЮ для spring-boot, оно может быть в одном пакете (или дочернем) или в совершенно не связанном пакете (с@ComponentScan
и@EnableJpaRepositories
). Опять же : не имеет значения, используете ли вы@Repository
интерфейс.2. Я не уверен, что понял ваш комментарий, я считаю, что это то, что я сказал.
3. Если вы не использовали Spring Boot или репозиторий находился в дочернем пакете, его необходимо было бы аннотировать и отсканировать пакет
4. Я не понимаю вашего редактирования сейчас, так как вы оставили странное или репозиторий не был в пакете , что вроде как не имеет смысла. Но в любом случае, это все равно неверно.
5. правильно!
@Repository
На интерфейсе это не нужно, никогда 🙂
Ответ №2:
Взято из весенней документации:
Аннотация @Repository является маркером для любого класса, который выполняет роль или стереотип репозитория (также известный как Объект доступа к данным или DAO). Среди применений этого маркера-автоматический перевод исключений, как описано в разделе Перевод исключений.
Он служит в основном в качестве маркера стереотипа, но @Repository-это специализация @Component, которую spring использует для сканирования путей к классам.
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
как хранилище.