我们已经使用Google Guice框架进行依赖注入。我需要在Java创建一个接口的多个insatnce。
执行从这里开始:下面代码中的KFHRecordValidator.java类:
public class KfhRecordValidator implements RequestHandler<Request, Response> {
public Response handleRequest(Request request, Context context)
{
// Resolve the necessary dependencies, and process the request.
Injector injector = Guice.createInjector(new
DependencyModule());
Processor processor =
injector.getInstance(Processor.class);
return processor.process(request, context);
}}
process类具有RecordValidationHelper类的引用,并且注入是通过构造函数进行的。iRecordValidationService.java是一个具有validate方法的接口。
public interface IRecordValidationService {
void validate(Record record) throws ValidationException;}
类处理器有一个名为process的方法,正在RecordValidationHelper类中调用该方法。
class Processor {
private final RecordValidationHelper recordValidationHelper;
@Inject
@SuppressWarnings({"WeakerAccess"})
public Processor(IRecordValidationService recordValidationService,
IRecordService<ErrorRecord> recordService,
S3UtilsInterface s3Utils, IEnvironmentVariableReader
environmentVariableReader) {
this.recordValidationHelper = new
RecordValidationHelper(recordValidationService);
this.errorRecordHelper = new
ErrorRecordHelper(recordService, environmentVariableReader);
}
public Response process(Request request, @SuppressWarnings("unused") Context context) {
// Validate records
List<LambdaRecord> records = recordValidationHelper.processRecords(request.getRecords());}
类DependencyModule.java extneds AbstractModule具有configure方法的Guice注入类。
class DependencyModule extends AbstractModule {
@Override
protected void configure() {
String validationType = System.getenv("ValidationType");
validationType= validationType.toLowerCase(Locale.ENGLISH);
String valType[]= validationType.split(",");
int length= valType.length;
for(int i=0;i<length;i++){
switch(valType[i]){
case "json":
bind(IRecordValidationService.class).to(JsonValidationService.class);
break;
case "avro":
bind(IRecordValidationService.class).to(AvroSchemaValidationService.class);
break;
case "clientlogging":
bind(IRecordValidationService.class).to(ClientLoggingValidationService.class);
break;
case "servicelogs":
bind(IRecordValidationService.class).to(ServiceLoggingValidationService.class);
break;
default:
throw new UnsupportedOperationException(String.format("Encountered an unsupported ValidationType of '%s'.", valType[i]));
}
} } }
所以问题是,如果我获得的验证类型是AVRO、JSON,那么它将把IRecordValidationService绑定到各自的JSONValidationService/AVROSchemaValidationService类。我需要为它创建多个实例,但它一次只支持一个实例。下面是RecordValidationHelper.java类
公共类RecordValidationHelper扩展AbstractModule{private final IRecordValidationService RecordValidationService;
@Inject
public RecordValidationHelper(IRecordValidationService recordValidationService) {
this.recordValidationService = recordValidationService;
}
public List processRecords(List requestRecords){List records=new
for (RequestRecord record : requestRecords) {
try {
Record domainRecord = new Record();
domainRecord.setKey(record.getRecordId());
domainRecord.setValue(new String(Base64.getDecoder().decode(record.getData())));
// Use the injected logic to validate the record.
((IRecordValidationService)
recordValidationService).validate(domainRecord);}
catch (ValidationException ex) {}}}
return records;}
任何对如何实现它以获得适合于此的多个实例有任何想法的人。
在dependencymodule
中,使用名称绑定:
bind(IRecordValidationService.class)
.annotatedWith(Names.named("json"))
.to(JsonValidationService.class);
bind(IRecordValidationService.class)
.annotatedWith(Names.named("avro"))
.to(AvroSchemaValidationService.class);
bind(IRecordValidationService.class)
.annotatedWith(Names.named("clientlogging"))
.to(ClientLoggingValidationService.class);
bind(IRecordValidationService.class)
.annotatedWith(Names.named("servicelogs"))
.to(ServiceLoggingValidationService.class);
然后在你的注射器里:
@Inject
public RecordValidationHelper(
@Named("json") IRecordValidationService jsonValidation,
@Named("avro") IRecordValidationService avroValidation,
@Named("clientlogging") IRecordValidationService clientLoggingValidation,
@Named("servicelogs") IRecordValidationService serviceLogsValidation,
) {
this.jsonValidation = jsonValidation;
this.avroValidation = avroValidation;
this.clientLoggingValidation = clientLoggingValidation;
this.serviceLogsValidation = serviceLogsValidation;
}
有关更多信息,请参阅Guice的BindingAnnotation wiki页面。
对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢
问题内容: 我想使用Django Rest Framework通过一个API调用来保存和更新多个实例。例如,假设我有一个“教室”模型,可以有多个“老师”。如果我想创建多位老师并稍后更新他们的所有教室编号,我该怎么做?我是否必须为每位老师进行API调用? 我知道目前我们无法保存嵌套模型,但是我想知道是否可以在教师级别保存它。谢谢! 问题答案: 我知道这个问题是在不久前问到的,但是我在试图自己解决这个
场景:一个应用程序有多个实体。每个实体表示一个数据库表。所有数据库表都有一个主键列,但列名不同。 实体示例: 服务类示例: 问题:如果我像下面这样声明dao接口: 将参数作为发送到JPararePository中,然后我的方法在服务类中运行良好。 但是Spring不允许在没有列的情况下创建类。所以我必须声明一个ID列。同样,在我的数据库中,每个表都有一个主列,但所有表的该列的名称是不同的。例如,表
我没有问题绑定单例实例到其他一些实例使用@注入。但是,当涉及到绑定一个类的更多实例到其他一些实例(这是单例),它拒绝以某种方式绑定它,我得到了空引用。 我的代码示例是: 当我创建几个WebSocketManagerImpl实例时,每个factoryImpl字段都是空指针。我做错什么了吗?
我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。
问题内容: 我有几个函数需要精确的参数类型(又名): 我这样使用它们,效果很好: 但是我想知道是否有可能使代码更简洁,即 如果是这样,我应该放什么呢? 编辑: 1)我使用和作为简化示例。在我的实际代码中,我使用自定义类。 2)我需要知道我的函数中的确切类型(类),所以我不能 提前使用谢谢 问题答案: 您可以使用或者,这是双方共同的超类型和。 但是,泛型是不必要的: 等同于 删除后。 对于输入参数具