我如何在枚举构造函数中@Autowire @Component`s?

How do I @Autowire @Component`s in an enum constructor?

比方说,我有一个 class ProviderServiceMap<ProviderEnum, Provider> 字段。这个 class 的构造函数如下

@Autowired
ProviderService(ProviderA provA, ProviderB provB, ...) {
    map.put(ProviderEnum.A, provA);
    map.put(ProviderEnum.B, provB);
    ...
}

Provider 是一个抽象的 class 继承者,其继承者用 @Component 注释。
然后我意识到至少有两种可能更好的方法:

  1. 使用EnumMap执行Map。现在,我使用 HashMap.
  2. ProviderEnum 枚举中有一个 Provider 字段 并从 ProviderService 中完全删除地图。

第二个选项似乎是更简洁的解决方案,我开始这样写

enum ProviderEnum {
    A(/* ?WHAT DO I PUT HERE? */),
    B(/* Is it some kind of BeanFactory.getBean(ProviderB.class)? */),
    ...;

    private final Provider provider;
    
    ProviderEnum(Provider provider) {
        this.provider = provider;
    }
    
    public Provider getProvider() {
        return this.provider;
    }    
}

但是,我不知道应该在这些构造函数中放入什么,因为它肯定不同于使用 @Autowired.
的通常情况 我想我应该考虑使用 BeanFactory 但是有没有办法构造函数注入它?我应该现场注射吗? 还是坚持 EnumMap 更好?

枚举是静态的,我想更好的方法是将一个类型的集合自动装配到您的服务中,就像这样

  1. 提供商接口(或您如何看待它)
public interface Provider {
    // This can be your differentiator
    ProviderEnum getProviderType();
    void doSomeProviderThing();    
}
  1. 在您的 ProviderService class 中,您可以自动装配一个集合并使用 PostConstruct 完成剩下的工作
@Component
public class ProviderService {

    // This will autowire all providers as a collection
    @Autowired
    private  Collection<Provider> providers;
 
    @PostConstruct
    public void init() {
        providers.stream().foreach( provider -> {
            // Do you mapping with provider.getProviderType() if you still see value.
            // like map.put(provider.getProviderType(), provider);
        }); 
    }

}