Читая о создании пользовательских запросов в Spring, я заметил, что ни один из классов (UserRepositoryCustom
, UserRepositoryCustomImpl
, UserRepository
) используйте аннотацию @Repository
.
Меня это удивило, потому что обычно все классы приложений Spring чем-то аннотируются, чтобы их можно было обнаружить и для них сгенерировался прокси. Вот как работает аспектно-ориентированный фреймворк в Java.
Затем я проверил свой старый рабочий код и понял, что интерфейс моего репозитория также не использует аннотацию. Тем не менее, это @Autowired
как зависимость от контроллеров и других классов, которые его используют. Пример:
// AddressRepository.java
public interface AddressRepository extends CrudRepository<Address, String> {
}
// Repositories.java
@Getter // lombok
@Component
public class Repositories { // autowire this to have access to all repo's
private final AddressRepository addressRepository;
@Autowired
public Repositories(AddressRepository addressRepository) {
this.addressRepository = addressRepository;
}
}
В связи с этим возникают вопросы: Когда следует использовать аннотацию? и Как получается, что неаннотированный класс автоматически обнаруживается при сканировании компонентов Spring?