如何在枚举构造函数中@autowire@component`s?

7cwmlq89  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(408)

比如说,我有课 ProviderService 用一个 Map<ProviderEnum, Provider> 现场。这个类的构造函数如下

@Autowired
ProviderService(ProviderA provA, ProviderB provB, ...) {
    map.put(ProviderEnum.A, provA);
    map.put(ProviderEnum.B, provB);
    ...
}
``` `Provider` 是一个抽象类,其继承者用 `@Component` .
然后我意识到至少有两种可能更好的方法:
使用 `EnumMap` 为了实施 `Map` . 现在,我用 `HashMap` .
有一个 `Provider` 内的字段 `ProviderEnum` 枚举并从中删除Map `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` ?
gt0wga4j

gt0wga4j1#

枚举是静态的,我认为更好的方法是将某个类型的集合自动连接到服务中,类似这样
提供程序接口(或您如何看待它)

public interface Provider {
    // This can be your differentiator
    ProviderEnum getProviderType();
    void doSomeProviderThing();    
}

在providerservice类中,可以自动关联一个集合并使用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);
        }); 
    }

}

相关问题