【问题标题】:How to dynamically create instances of a class based upon their annotation value?如何根据注释值动态创建类的实例?
【发布时间】:2019-12-12 01:41:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 读取配置文件不会是我猜的问题,你会得到课程using reflection。您可以使用c.getClass().getAnnotations() 获得注释,并可以像here 所示那样对其进行剖析。但我怀疑 guice 可能会以某种方式支持这些东西。
  • 这个的最终用例是什么?您是否使用地图获取类然后创建实例?还是您希望地图已经有注入的实例可用?

标签: java dependency-injection guice


【解决方案1】:

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

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

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

// 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&lt;String, Job&gt;,它为每个键包含相应的类实例。

进一步阅读 Guice 和配置

我有一个类似的用例,尽管实例化依赖关系图更复杂,依赖关系图因配置而异。如果您有兴趣并将我的用例与您的用例进行比较,我将其总结为 document。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2015-12-17
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多