将枚举值公开为@beans

hgb9j2n6  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(283)

我有一个架构,枚举实现一个接口。

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猫科动物的所有示例都是可扫描的

brccelvz

brccelvz1#

你可以用 @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);
        }
    }

}

相关问题