Как найти конкретный объект класса из списка объектов в Spring при загрузке зависимости - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю систему плагинов, где плагин будет извлечен из БД, моя реализация выглядит следующим образом

Базовый интерфейс плагинов

@Service
public interface Plugin{
   somemethod();
}

В пакете плагинов загрузите весь плагин где внутренним именем пакета будет имя плагина и класс с именем плагина

package <>.plugin.Myplugin

import ....

@Service 
class MyPlugin implements Plugin {
   @Override
   somemethod() {}
}

Я загружаю весь реализованный класс интерфейса плагина в инъекцию зависимостей

@Controller
public class MyCon {

   private List<Plugin> plugins

   public MyCon(List<Plugin> plugins) {
        this.plugins = plugins;
   }

   ssomefuncitonality() {

        String objectNeedOfClass = <CLASS_NAME>;
        //Here
        System.out.println(this.plugins);
   }
}

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

1 Ответ

0 голосов
/ 01 апреля 2020

Итерируйте список и проверьте имя класса:

Optional<Plugin> plugin = this.plugins.stream()
        .filter(p -> p.getClass().getSimpleName().equals(objectNeedOfClass))
        .findFirst();

Если plugins может быть большим, и вы делаете это часто, постройте карту в конструкторе:

private Map<String, Plugin> plugins

public MyCon(List<Plugin> plugins) {
    this.plugins = plugins.stream().collect(Collectors.toMap(
            p -> p.getClass().getSimpleName(), Function.identity()));
}

ssomefuncitonality() {
    String objectNeedOfClass = ...;
    Plugin plugin = this.plugins.get(objectNeedOfClass);
    ...
}
...