【问题标题】:How to create beans dynamically using a DI framework如何使用 DI 框架动态创建 bean
【发布时间】:2022-01-20 23:25:00
【问题描述】:

要求是这样的:用户输入是单个字符,后跟一个整数数组,例如'A 1 2'、'B 3 4 5'、'C 1'等。单个字符表示要构造哪个类并且整数是该构造函数的输入参数。请注意,不同的类可能需要不同数量的整数。

然后我们需要编写一个程序来解析用户输入并相应地创建对象。

我的方法是使用正则表达式来解析和硬编码要调用的类。

但另一位高级开发人员表示,更好的想法是使用依赖注入来根据用户输入自动创建对象。他给出了另一个创建接口和使用spring框架依赖注入(不是spring boot)的提示。

我仍然对如何以这种方式动态创建 bean 感到困惑。有人可以帮忙吗?

【问题讨论】:

  • 由于整数是输入参数,我们是否假设每个类中都有一些字段保存整数数组,或者数组的元素应该是构造函数的单独参数?
  • 您可能想选择一个 DI Container 来使用,并查看文档如何使用其 API 为已配置的类/服务请求实例。

标签: java spring dependency-injection


【解决方案1】:

您可以为可以创建的类创建一个通用接口,以及一个转换输入的工厂 bean。

// common interface
interface MyObject {
  void someMethod();
}
class A implements MyObject {
  public A(List<Integer> params) { ... }
}
class B implements MyObject {
  public B(List<Integer> params) { ... }
}

// parsed data
class Input {
 char character;
 List<Integer> ints;
 // getters, setters
}
interface MyObjectFactory {
  public MyObject apply(Input input);
}

@Bean
class MyObjectFactory implements MyObjectFactory {
  public MyObject apply(Input input) {
    // create object from input, eg switch over input.getCharacter()
  };
}
// injected
class MyClientService {
 @Autowired
 MyObjectFactory objectFactory;

 public void doStuff() {
   List<Input> parsedInputs = parse(something);
   for (Input input : parsedInputs) {
     MyObject object = objectFactory.apply(input);
     // ...
   }
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多