java - 如何在枚举构造函数中 @Autowire @Component`s?
问题描述
比方说,我有一个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
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
?
解决方案
枚举是静态的,imo 更好的方法是将类型的集合自动装配到您的服务中,就像这样
- 提供者接口(或你如何看待它)
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);
});
}
}
推荐阅读
- json - 在 Flutter 中提取 JSON 数据时遇到问题
- nvidia - 当前正在使用哪个 gpu 驱动程序版本?2080 或 2080ti
- flutter - Flutter:无法显示来自某些 url 的图像
- javascript - Javascript/VUE2:如何检查多个匹配项的值,
- powershell - 通过 Powershell 返回 COM+ 应用程序用户帐户
- javascript - 返回 React 状态数组映射值
- c# - 使用 OpenCvSharp 绘制矩形
- javascript - 日期时区 Fromat。PHP 与 JS
- javascript - 如何解决此 FB Firebase 身份验证凭据错误
- reactjs - 电子重定向的自定义方案