【问题标题】:Dependency Injection of factory of objects对象工厂的依赖注入
【发布时间】:2023-03-20 14:38:02
【问题描述】:

如果我们有几个类看起来像:

@Device()
@Model("some model")
@Variant("A")
public class SomeModelVariantA extends BaseDevice {

    public SomeModelVariantA (InputStream in, OutputStream out, int encoding) throws IOException {
        super(in, out, encoding);
    }

    @Override
    @CommandSpec("41")
    @WithoutArguments
    @WithoutResponse
    public Response init(Command args) throws NotSupportedException, IOException {
        return null;
    }

我使用 JavaPoet 和注释处理生成类实现。 我有我使用的所有注释的项目,具有注释处理器的项目编译器来处理带注释的类和带有注释、生成的类和其他逻辑的应用程序项目。所有生成的类都扩展了基础BaseDevice 类,如下所示:

/**
 * Generated on Fri Aug 28 11:03:21 EEST 2015
 */
public final class SomeModelVariantA extends BaseDevice {
  public SomeModelVariantA (InputStream arg0, OutputStream arg1, int arg2) throws IOException {
    super(arg0, arg1, arg2);
  }

  @Override
  public Response init(Command arg0) throws NotSupportedException, IOException {
    StringBuilder builder = new StringBuilder("");
    Response response = new Response();

    customCommand(41, builder.toString());
    return response;
  }

我已经生成了几个具体的设备,下一步是创建一个使用这些设备的 api。

public class Api {

    BaseDevice device;

    Api(String device, InputStream is, OutputStream os, int encoding) {
        if ("SomeModelVariandA1".contentEquals(device)) {
            device = new SomeModelVariantA(is, os, encoding);
        }
        ... else if for other devices
    }

    public void callInit() {
        device.init(null);
    }
}

那么我如何为所有设备生成工厂并通过一些字符串名称将设备注入 Api 类。如何处理提供使用 api 构造函数的输入和输出流创建的设备。 dagger 2 和 google auto factory 是否适合此目的,有人可以提供示例用法吗?

谢谢

【问题讨论】:

    标签: java dependency-injection dagger-2


    【解决方案1】:

    需要设置为concreteClass类全名(包+类名)然后使用Class.forName(concreteClass)

    例如,如果您在com.blablabla.classes 包中定义了ClassA,则需要设置为concreteClass 值"com.blablabla.classes.ClassA"。 然后,如果您只想创建扩展 BaseClass 的类对象,则需要像这样定义新类:

    Class<T extends BaseClass> injectedClass = Class.forName(concreteClass); 或者,如果你想创建所有的类对象,你需要定义:

    Class injectedClass = Class.forName(concreteClass);

    【讨论】:

    • 我尝试生成工厂,但无法使用Class.forName(concreteClass) 解析这些具体类。生成逻辑在编译器项目中,生成的类在其他项目中。
    • 你能提供代码示例吗?我无法理解compiler project。如果您的意思是,它们位于不同的 jar 中,那么您需要将这个 jar 包含在您的类路径中。
    • 我有 3 个项目 - 注释、编译器和应用程序项目。我在应用程序项目中注释了类,并使用我使用注释处理器在应用程序项目中生成这些具体类的编译器项目。
    猜你喜欢
    • 2015-01-01
    • 2012-08-09
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多