Выставьте значения Enum как @Beans - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть архитектура, в которой Enum реализует интерфейс.

public interface Animal {
  String getLatinName();
}

А затем перечисление с некоторыми подтипами

@Component //Something like this is what I am after
public enum Feline implements Animal {
   CAT("Felis Catus"),
   LYNX("Lynx Lynx");    
}

Это позволяет зависимым библиотекам расширять экземпляры, но для этого мне потребуется механизм, подобный следующему, чтобы я мог собрать все они с помощью ComponentScan

@Autowire
Set<Animal> animals;  //Injecting all occurrences of Animal instances

Для этого подхода мне нужно сделать все экземпляры моего enum Feline доступными для сканирования

1 Ответ

1 голос
/ 14 февраля 2020

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

@Configuration
public class FelineConfig {

    @Bean
    public Feline cat() {
        return Feline.CAT;
    }

    @Bean
    public Feline lynx() {
        return Feline.LYNX;
    }

}

ОБНОВЛЕНИЕ

Если вы хотите, чтобы все значения перечисления были автоматически зарегистрированы, вы можете сделать это с помощью BeanFactoryPostProcessor:

@Configuration
public class FelineConfig implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (Feline feline : Feline.values()) {
            String beanName = Feline.class.getName() + "." + feline.name();
            beanFactory.registerSingleton(beanName, feline);
        }
    }

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