我如何在枚举构造函数中@Autowire @Component`s?
How do I @Autowire @Component`s in an enum constructor?
比方说,我有一个 class ProviderService
和 Map<ProviderEnum, Provider>
字段。这个 class 的构造函数如下
@Autowired
ProviderService(ProviderA provA, ProviderB provB, ...) {
map.put(ProviderEnum.A, provA);
map.put(ProviderEnum.B, provB);
...
}
Provider
是一个抽象的 class 继承者,其继承者用 @Component
注释。
然后我意识到至少有两种可能更好的方法:
- 使用
EnumMap
执行Map
。现在,我使用 HashMap
.
- 在
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
更好?
枚举是静态的,我想更好的方法是将一个类型的集合自动装配到您的服务中,就像这样
- 提供商接口(或您如何看待它)
public interface Provider {
// This can be your differentiator
ProviderEnum getProviderType();
void doSomeProviderThing();
}
- 在您的 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);
});
}
}
比方说,我有一个 class ProviderService
和 Map<ProviderEnum, Provider>
字段。这个 class 的构造函数如下
@Autowired
ProviderService(ProviderA provA, ProviderB provB, ...) {
map.put(ProviderEnum.A, provA);
map.put(ProviderEnum.B, provB);
...
}
Provider
是一个抽象的 class 继承者,其继承者用 @Component
注释。
然后我意识到至少有两种可能更好的方法:
- 使用
EnumMap
执行Map
。现在,我使用HashMap
. - 在
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
更好?
枚举是静态的,我想更好的方法是将一个类型的集合自动装配到您的服务中,就像这样
- 提供商接口(或您如何看待它)
public interface Provider {
// This can be your differentiator
ProviderEnum getProviderType();
void doSomeProviderThing();
}
- 在您的 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);
});
}
}