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

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

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

  1. @Autowired
  2. ProviderService(ProviderA provA, ProviderB provB, ...) {
  3. map.put(ProviderEnum.A, provA);
  4. map.put(ProviderEnum.B, provB);
  5. ...
  6. }
  7. ``` `Provider` 是一个抽象类,其继承者用 `@Component` .
  8. 然后我意识到至少有两种可能更好的方法:
  9. 使用 `EnumMap` 为了实施 `Map` . 现在,我用 `HashMap` .
  10. 有一个 `Provider` 内的字段 `ProviderEnum` 枚举并从中删除Map `ProviderService` 完全是。
  11. 第二个选择似乎是更干净的解决方案,我开始这样写

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

  1. private final Provider provider;
  2. ProviderEnum(Provider provider) {
  3. this.provider = provider;
  4. }
  5. public Provider getProvider() {
  6. return this.provider;
  7. }

}

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

gt0wga4j1#

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

  1. public interface Provider {
  2. // This can be your differentiator
  3. ProviderEnum getProviderType();
  4. void doSomeProviderThing();
  5. }

在providerservice类中,可以自动关联一个集合并使用postconstruct来完成其余的工作

  1. @Component
  2. public class ProviderService {
  3. // This will autowire all providers as a collection
  4. @Autowired
  5. private Collection<Provider> providers;
  6. @PostConstruct
  7. public void init() {
  8. providers.stream().foreach( provider -> {
  9. // Do you mapping with provider.getProviderType() if you still see value.
  10. // like map.put(provider.getProviderType(), provider);
  11. });
  12. }
  13. }
展开查看全部

相关问题