我正在处理的项目是一个春季启动项目,我需要从EJB项目中迁移同一接口的多个实现。 有一项工作需要使用所有这些实例,我们想使用一种灵活的实现,例如java ejbs支持的实现:
@Inject
private @Any
Instance<FleetAnalyzerProvider> fleetAnalyzerProviders;
在源项目中,它使用了提供程序生成器:
private void initializeProvider(String type) {
try {
final DeviceTypesProviderBuilder providerBuilder = new DeviceTypesProviderBuilder(type);
final Instance qualifiedInstance = this.fleetAnalyzerProviders.select(providerBuilder);
this.analyzerProvider = (FleetAnalyzerProvider) qualifiedInstance.get();
} catch (final Exception e) {
this.logger.error("[initializeProvider] Failed for type [{}] due to: {}", type, e);
}
}
其中DeviceTypesProviderBuilder为:
public class DeviceTypesProviderBuilder extends AnnotationLiteral<DeviceTypes> implements DeviceTypes {
private final Type type;
public DeviceTypesProviderBuilder(String type) {
this.type = DeviceTypes.Type.getEnum(type);
}
@Override
public Type value() {
return type;
}
}
和设备类型:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, PARAMETER, FIELD, TYPE})
public @interface DeviceTypes {
Type value();
enum Type {
...
}
}
春季有类似的选择吗?
我看到了这样的语法的帖子(Autowire reference beans into list by type):
@Autowired
private FleetAnalyzerProvider[] fleetAnalyzerProviders;
但是,如何确定正确的提供者?
链接的spring文档中的示例太简单了,没有明确解释这种特殊可能性。