6

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?

Henrique Luiz
  • 191
  • 1
  • 12

1 Answers1

6

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);
}
Jeff Scott Brown
  • 26,804
  • 2
  • 30
  • 47