首页 > 解决方案 > 如何根据注释值动态创建类的实例?

问题描述

我有一堆实现接口Job的类。这些类中的每一个都有一个注释 @Work(name="相应的名称")

这些类中的每一个都有不同的私有字段,这些私有字段在构造过程中使用 guice 注入。现在我想创建一个映射映射,读取一个类似这样的配置文件

- name: "test1"
  worker_annotation = "annotation1"
- name: "test2"
  worker_annotation = "annotation2"
- name: "test3"
  worker_annotation = "annotation3"

所以这个模块需要做的是读取这个配置文件,获取所有带有@Work注解的类,并创建一个map Map,其中key字符串对应于配置文件中的名称,Job是实现Job接口的对应类并使用相应的 Worker 注释进行注释。

标签: javadependency-injectionguice

解决方案


我要提供的解决方案有一个限制,即它仅在您的所有工作类别都属于不同类型(= 类别)的情况下才有效,并且我认为就我可以从您的描述中假设的情况而言是这种情况。否则,您将需要引入键,以便 Guice 可以区分相同的类型。

您的示例听起来像是Guice扩展的MapBinder的工作。multibindings

我可以想到类似以下代码(未经测试):

// code in some Guice module configure() method
...
SomeConfig config = loadConfig(); // I invented this config code. Adapt!
...
MapBinder<String, Job> mapbinder
     = MapBinder.newMapBinder(binder(), String.class, Job.class);
for(String name : config.allNames()) {
     String workerName = config.lookUpWorkerName(name); // not Guice-related
     Class<?> clazz = lookUpJobClassFromAnnotationName(workerName); // not Guice-related either
     mapbinder.addBinding(name).to(clazz); // name must be unique
}

然后在其他一些类中,您可以注入Map<String, Job>它,它为每个键包含相应的类实例。

关于 Guice 和配置的进一步阅读

我有一个类似的用例,尽管实例化依赖关系图更复杂,这取决于配置。如果您有兴趣并将我的用例与您的用例进行比较,我将其总结在一个文档中。


推荐阅读