I have an interface that looks like.
interface Task {
void run(String param);
}
And I have many implementations annotated with @Named("same_name")
I want to get an implementation similar to Spring:
@Inject
ApplicationContext appContext
void execTask(String name, String param) {
Task task = appContext.getBeam(Task.class, name);
task.run(param);
}
I managed to do this using a search for annotation in bean definitions, similar to:
(code in Groovy)
void execTask(String name, String param) {
Collection<BeanDefinition<Task>> definitions = appContext.getBeanDefinitions(Task)
BeanDefinition<Task> definition = definitions.find { BeanDefinition<Task> it ->
it.getAnnotation(Named)?.stringValue()?.filter {it == name }?.present
}
Task task = appContext.getBean(Task, definition.declaredQualifier)
task.run(param)
}
but it seems like a lot for something simple.
is there a more direct way?
You can retrieve a bean with a name qualifier:
import io.micronaut.inject.qualifiers.Qualifiers
// ...
void execTask(String name, String param) {
Task task = appContext.getBean(Task.class,
Qualifiers.byName(name));
task.run(param);
}