Как @Autowire получает бин без использования аннотации @Bean - PullRequest
0 голосов
/ 07 октября 2019

Я создал в проекте Springboot, где есть класс JPA: -

package com.example.demo.jpa;

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.example.demo.model.Users;

@Repository
public interface AppRepo extends CrudRepository<Users, Integer>, AppRepoCustom {

    public List<Users> findAllByJob(String job);

}

Другой интерфейс AppRepoCustom выглядит следующим образом:

package com.example.demo.jpa;

import java.util.List;

public interface AppRepoCustom {
    public List<String> getAllNames();

}

Реализация интерфейса: -

package com.example.demo.jpa;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.example.demo.model.Users;

public class AppRepoCustomImpl implements AppRepoCustom {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    public List<String> getAllNames() {
        Query query = entityManager.createNativeQuery("SELECT name FROM springbootdb.Users as em ", Users.class);
        return query.getResultList();
    }

}

Теперь внутри моего класса контроллера я внедряю объект AppRepo

@Autowired
AppRepo appRepo;

Мой вопрос заключается в том, что я нигде не указал, какая реализация AppRepo будет внедрена, тогда как пружина способназалить его без ошибок? Когда мы создаем объект типа интерфейс, такой как Interface objectName = new implClass ();где implClass содержит всю реализацию методов интерфейса. Но в приведенном выше примере некоторые реализации находятся в классе CrudRepository, а некоторые - в AppRepoCustom, поэтому как здесь работает создание этого объекта? Я смущен. Как внутренние объекты создаются при создании объекта, такого как Interface objectName = new implClass () и в данном сценарии.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Это будет неоднозначно, если вы @Autowired AppRepoCustom. Но в вашем случае у вас есть @Autowired AppRepo, который является потомком интерфейса AppRepoCustom . Поэтому Spring знает, что вы попросили предоставить компонент дочернего интерфейса, и предоставляет его без ошибок.

Относительно того, какая конкретная реализация будет автоматически подключена в случае AppRepo, см. Следующую ссылку из документации Spring.

В этом случае мы просим Spring сканировать com.acme.repositories и все его подпакеты на наличие интерфейсов, расширяющих Repository или один из его подчиненных интерфейсов. Для каждого найденного интерфейса будет регистрироваться специфическая технология сохраняемости FactoryBean для создания соответствующих прокси-серверов, обрабатывающих вызовы методов запроса.

Для получения дополнительной информации прочитайте документацию .

0 голосов
/ 07 октября 2019

Загрузочное приложение Spring сканирует все классы с помощью тегов, например @repository, @Component, @Bean, @Controller и т. Д., И создает объекты. Кроме того, в вашем случае у вас есть @Autowired класса @Apprepo, поэтому нет конфликта, он должен работать отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...