如何使用 google Guice 创建多个相同类型的实例
how to create multiple instance of same type using google Guice
我们已经使用 Google Guice 框架进行依赖注入。我需要在 java.
中创建一个接口的多个实例
执行从这里开始:KfhRecordValidator.java class 在下面的代码中:
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);
}}
进程 class 引用了 RecordValidationHelper class 并且注入是通过构造函数进行的。
IRecordValidationService.java 是一个具有验证方法的接口。
public interface IRecordValidationService {
void validate(Record record) throws ValidationException;}
class 处理器有一个名为 process 的方法,在 RecordValidationHelper class.
中被调用
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());}
Class DependencyModule.java 具有配置方法的 Guice 注入的 extneds AbstractModule class。
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 class。我需要为此创建多个实例,但它一次只支持一个实例。
下面是RecordValidationHelper.javaclass
public class RecordValidationHelper 扩展了 AbstractModule {
private final IRecordValidationService recordValidationService;
@Inject
public RecordValidationHelper(IRecordValidationService recordValidationService) {
this.recordValidationService = recordValidationService;
}
public 列出流程记录(列出请求记录){
列出记录 = new ArrayList<>();
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;}
任何人都知道应该如何实现以获得适合此的多个实例。
使用 @Named
绑定
在您的 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's BindingAnnotation wiki page。
我们已经使用 Google Guice 框架进行依赖注入。我需要在 java.
中创建一个接口的多个实例执行从这里开始:KfhRecordValidator.java class 在下面的代码中:
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);
}}
进程 class 引用了 RecordValidationHelper class 并且注入是通过构造函数进行的。 IRecordValidationService.java 是一个具有验证方法的接口。
public interface IRecordValidationService {
void validate(Record record) throws ValidationException;}
class 处理器有一个名为 process 的方法,在 RecordValidationHelper class.
中被调用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());}
Class DependencyModule.java 具有配置方法的 Guice 注入的 extneds AbstractModule class。
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 class。我需要为此创建多个实例,但它一次只支持一个实例。 下面是RecordValidationHelper.javaclass
public class RecordValidationHelper 扩展了 AbstractModule { private final IRecordValidationService recordValidationService;
@Inject
public RecordValidationHelper(IRecordValidationService recordValidationService) {
this.recordValidationService = recordValidationService;
}
public 列出流程记录(列出请求记录){ 列出记录 = new ArrayList<>();
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;}
任何人都知道应该如何实现以获得适合此的多个实例。
使用 @Named
绑定
在您的 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's BindingAnnotation wiki page。