在 Micronaut 中按名称获取 bean
Get bean by name in Micronaut
我有一个看起来像这样的界面。
interface Task {
void run(String param);
}
而且我有很多用@Named("same_name")注释的实现
我想获得类似于 Spring:
的实现
@Inject
ApplicationContext appContext
void execTask(String name, String param) {
Task task = appContext.getBeam(Task.class, name);
task.run(param);
}
我设法通过在 bean 定义中搜索注释来做到这一点,类似于:
(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)
}
但对于简单的事情来说似乎很多。
有没有更直接的方法?
您可以检索具有名称限定符的 bean:
import io.micronaut.inject.qualifiers.Qualifiers
// ...
void execTask(String name, String param) {
Task task = appContext.getBean(Task.class,
Qualifiers.byName(name));
task.run(param);
}
我有一个看起来像这样的界面。
interface Task {
void run(String param);
}
而且我有很多用@Named("same_name")注释的实现
我想获得类似于 Spring:
的实现@Inject
ApplicationContext appContext
void execTask(String name, String param) {
Task task = appContext.getBeam(Task.class, name);
task.run(param);
}
我设法通过在 bean 定义中搜索注释来做到这一点,类似于:
(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)
}
但对于简单的事情来说似乎很多。
有没有更直接的方法?
您可以检索具有名称限定符的 bean:
import io.micronaut.inject.qualifiers.Qualifiers
// ...
void execTask(String name, String param) {
Task task = appContext.getBean(Task.class,
Qualifiers.byName(name));
task.run(param);
}