Внедрить список всех бинов с определенным интерфейсом - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть класс (@Component bean), который выглядит примерно так:

@Component
public class EntityCleaner {

    @Autowired
    private List<Cleaner> cleaners;

    public void clean(Entity entity) {
         for (Cleaner cleaner: cleaners) {
             cleaner.clean(entity);
         }
    }
}

Очиститель - это интерфейс, и у меня есть несколько очистителей, которые я хочу, чтобы все они запускались (неследи за порядком).Сегодня я делаю что-то вроде этого:

 @Configuration
 public class MyConfiguration {
     @Bean
     public List<Cleaner> businessEntityCleaner() {
         List<Cleaner> cleaners = new ArrayList<>();
         cleaners.add(new Cleaner1());
         cleaners.add(new Cleaner2());
         cleaners.add(new Cleaner3());
         // ... More cleaners here

         return cleaners;
     }
 }

Есть ли способ построить этот список без определения специального метода в конфигурации?Именно эта пружина автоматически находит все эти классы, реализующие интерфейс Cleaner, создает список и вводит его в EntityCleaner?

1 Ответ

0 голосов
/ 02 декабря 2018

Javadoc из @Autowired говорит:

В случае типа зависимости Collection или Map контейнер автоматически связывает все bean-компоненты, соответствующие объявленному типу значения.

Таким образом, вы можете сделать что-то вроде:

@Component
public class SomeComponent {

    interface SomeInterface {

    }

    @Component
    static class Impl1 implements SomeInterface {

    }

    @Component
    static class Impl2 implements SomeInterface {

    }

    @Autowired
    private List<SomeInterface> listOfImpls;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...