Проводка bean-компонентов, которые не реализуют интерфейс тега в списке, используя Spring - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть набор классов, который расширяет абстрактный класс Executor. Допустим, это классы ExecutorOne, ExecutorTwo и ExecutorThree. Затем у меня есть четвертый класс, расширяющий тип Executor, ExecutorFour, но также реализующий интерфейс NotUsable.

Я использую Spring 4.x для добавления экземпляра всех вышеупомянутых bean-компонентов в список.

@Autowired
private final List<Executor> executors;

Есть ли механизм, позволяющий мне не вводить компонент типа ExecutorFour в список executors? Я хочу, чтобы список executors содержал только три компонента, соответственно типа ExecutorOne, ExecutorTwo и ExecutorThree.

Я попытался взглянуть на аннотацию @Conditional, но, похоже, в этой ситуации это бесполезно.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Есть еще один вариант, он помогает достичь того, что вы пытаетесь, но не дает прямого ответа на вопрос.

Spring не имеет такого механизма исключения, в конце концов, все 4 бина действительныSpring Bean и создаются.

Однако вы можете работать с Usable интерфейсом, вместо NotUsable интерфейса маркера.Вот (в значительной степени очевидный) пример:

interface Executor {}

interface UsableExecutor extends Executor {}

class Executor1 implements UsableExecutor{...}
class Executor2 implements UsableExecutor{...}
class Executor3 implements UsableExecutor{...}
class Executor4 implements Executor {}  // note, doesn't implement UsableExecutor

@Component
class SomeClassWithUsableExecutors {

   private final List<UsableExecutor> usableExecutors;

   // an autowired constructor - only 3 elements will be in the list 
   public SomeClassWithUsableExecutors(List<UsableExecutor> usableExecutors) {
      this.usableExecutors = usableExecutors;
   } 
}
0 голосов
/ 12 сентября 2018

Хотя Spring не предоставляет грамматику «исключить эти классы» для @Autowired, он вместо этого предоставляет поддержку «включать эти классы» в форме @Qualifier.

Способ, которым это работает, заключается в создании пользовательского квалификатора, который вы будете применять на уровне классов к Executor классам, которые вы хотели бы иметь @Autowired во время выполнения. Spring сделает все возможное, чтобы нежелательные классы не попали в список:

  1. Создайте свой собственный классификатор, который будет применяться к нужным классам:

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Qualifier
    public @interface Usable {
        String value();
    }
    
  2. Примените свой квалификатор в точке инъекции:

    @Autowired
    @Usable
    private final List<Executor> executors;
    

То, что теперь сделано выше, заключается в том, что только Executor классы с пользовательским квалификатором @Usable будут внедрены в executors

...