Могу ли я использовать HashMap, чтобы выбрать, какой интерфейс (DAO) автоматически подключать в SpringBoot? - PullRequest
3 голосов
/ 07 августа 2020

Постараюсь быть максимально подробным. У меня много DAO, и мой сервис должен использовать один из них в зависимости от полученного ключа. Например -

if(key.equals("abc") {
   obj = abcDAO.getOne(id);
} else if(key.equals("xyz") {
   obj = xyzDAO.getOne(id);
}

Объект имеет тип родительского класса, а ab c, xyz .. все дочерние классы.

Моя идея - создать Map<String, ParentCLass>, чтобы получить объект, просто передав ключ вместо If-else, чтобы его было легко добавить для дальнейших изменений. Если бы это был обычный класс, я бы инициализировал карту как

Map<String, ParentClass> map. 
map.put("abc", new Abc());

Но поскольку DAO - это интерфейсы и для их использования требуется @Autowired, я не знаю, как продолжить. Я начинающий. Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 07 августа 2020

Spring может внедрить все bean-компоненты с одним и тем же интерфейсом в карту, если карта имеет String в качестве ключа (будет содержать имена bean-компонентов) и интерфейс как значение.

public interface MyDao {
    
}

@Autowired
private Map<String, MyDao> daos;

EDIT : Если вы используете Spring Data Repository, уже есть интерфейс тегов: Repository. Вы можете использовать приведенный ниже код для внедрения всех DAO в один компонент.

@Autowired
private Map<String, Repository> daos;

EDIT2: Пример

public interface UserRepo extends JpaRepository<User, Long> { ... }

@Service
public class MyService {

    @Autowired
    private Map<String, Repository> daos;

    public List<User> findAll() {
        return daos.get("userRepo").findAll();
    }
}
0 голосов
/ 09 августа 2020

Я создал методы для создания простых вещей jpa, я сохранил все репозитории в HashMap, вам просто нужно передать дочерний класс, и вы получите соответствующий JpaRepository

вы можете увидеть больше на https://github.com/fajaralmu/base_web_app

пример:

public List<Page> getAllPages() {
        List<Page> allPages = entityRepository.findAll(Page.class);
        
        return   allPages;
    }

введите описание изображения здесь

0 голосов
/ 07 августа 2020

Вы можете создать разные bean-компоненты для каждого из ваших Дао с определенным c именем

@Bean(name = "daoImpl1")
public Dao daoImpl1(){
return new DaoImpl1();

@Bean(name = "daoImpl2")
public Dao daoImpl2(){
return new DaoImpl2();

А затем @Autowire их, используя @Qualifier с этим именем

@Autowired
@Qualifier("daoImpl1")
private Dao daoImpl1;

@Autowired
@Qualifier("daoImpl2")
private Dao daoImpl2;
...