简体   繁体   English

在 Micronaut 中按名称获取 bean

[英]Get bean by name in Micronaut

I have an interface that looks like.我有一个看起来像的界面。

interface Task {
  void run(String param);
}

And I have many implementations annotated with @Named("same_name")我有很多用 @Named("same_name") 注释的实现

I want to get an implementation similar to Spring:我想得到类似于 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:我设法通过在 bean 定义中搜索注释来做到这一点,类似于:

(code in Groovy) (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:您可以检索带有名称限定符的 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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM