Dependency Injection
com.etdon.commons.di
In order to assist with dependency injection the library features a ServiceProvider
concept that can manage the registration and obtaining of services for you. The library features one implementation by default in the form of the InstanceServiceProvider
which manages services on a registered instance level.
In order to create a new InstanceServiceProvider
you should use the fluent builder accessible through the #builder
static factory method contained in the same class:
final ServiceProvider serviceProvider =
InstanceServiceProvider.builder()
.service(new ExampleService())
.selfService()
.build();
As shown in the code snippet services can be pre-registered during the building process, however, you can also register them later utilizing the ServiceProvider#register
method and its overloads. The #selfService
method instructs the ServiceProvider
to register itself to its own registry, if this is not something you need you can simply remove the call.
In order to obtain a service from a ServiceProvider
you can either use the #get
or #getOrThrow
(including overloads) method:
final ExampleService exampleService = serviceProvider.get(ExampleService.class);
The #get
and #getOrThrow
methods function similarly however the return value of the former is Nullable
while the latter will throw an exception if the service is not present in the registry making it NotNull
.
In order to check if a certain services is present in the registry the #has
method (including overloads) can be used:
final boolean hasService = serviceProvider.has(ExampleService.class);
In some situations multiple services of the same type might be needed:
final ExampleService importantService = new ExampleService();
final ExampleService otherImportantService = new ExampleService();
For situations like this a string identifier can be provided during the registration and other actions to distinguish between said services. The library internally creates a ServiceIdentifier
instance for all services wherever or not they have a string identifier to ensure proper identification.
serviceProvider.register("important", importantService);
serviceProvider.register("otherImportant", otherImportantService);
serviceProvider.has(ExampleService.class, "important");
serviceProvider.has(ExampleService.class, "otherImportant");
serviceProvider.get(ExampleService.class, "important");
serviceProvider.get(ExampleService.class, "otherImportant");
Last updated