如何使用 DI 框架动态创建 bean
How to create beans dynamically using a DI framework
要求是这样的:用户输入的是单个字符后面跟一个整数数组,比如'A 1 2'、'B 3 4 5'、'C 1'等。单个字符表示class 来构造,整数是该构造函数的输入参数。请注意,不同的 classes 可能需要不同数量的整数。
然后我们需要编写一个程序来解析用户输入并相应地创建对象。
我的方法是使用正则表达式进行解析和硬编码class来调用。
但另一位高级开发人员表示,更好的想法是使用依赖注入根据用户输入自动创建对象。他给出了另一个提示来创建一个接口并使用 spring 框架依赖注入(而不是 spring 引导)。
我仍然对如何以这种方式动态创建 bean 感到困惑。有人可以帮忙吗?
您可以为可以创建的 类 创建一个公共接口,以及一个转换输入的 Factory 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);
// ...
}
}
}
要求是这样的:用户输入的是单个字符后面跟一个整数数组,比如'A 1 2'、'B 3 4 5'、'C 1'等。单个字符表示class 来构造,整数是该构造函数的输入参数。请注意,不同的 classes 可能需要不同数量的整数。
然后我们需要编写一个程序来解析用户输入并相应地创建对象。
我的方法是使用正则表达式进行解析和硬编码class来调用。
但另一位高级开发人员表示,更好的想法是使用依赖注入根据用户输入自动创建对象。他给出了另一个提示来创建一个接口并使用 spring 框架依赖注入(而不是 spring 引导)。
我仍然对如何以这种方式动态创建 bean 感到困惑。有人可以帮忙吗?
您可以为可以创建的 类 创建一个公共接口,以及一个转换输入的 Factory 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);
// ...
}
}
}