我想实现DYNAMIC依赖注入。 GUICE是否支持这个?如果不是,你可以推荐任何其他的DI框架吗?动态依赖注入
应通过@Inject注入的实现必须在运行时确定,例如,通过与用户的交互。
类似这些questiones: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html
谢谢
我想实现DYNAMIC依赖注入。 GUICE是否支持这个?如果不是,你可以推荐任何其他的DI框架吗?动态依赖注入
应通过@Inject注入的实现必须在运行时确定,例如,通过与用户的交互。
类似这些questiones: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html
谢谢
实现需要根据输入而有所不同,在某些时候,您将不得不将输入解析为某种类。
如果你想让这个映射生活在Guice中,那么你基本上得到一个基于参数的实现,映射到the SO question I just answered here。您可以编写一个小型注入类,它接受输入并返回一个完全注入的实现。
如果你已经有一个映射,并有(例如)一类的文字在一个变量,那么你可以inject an Injector
directly并请它替实施。
class YourClass {
@Inject Injector injector;
SomeInterface yourMethod(String input) {
Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
return injector.getInstance(clazz);
}
Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
// Implement this as needed.
return SomeInstance.class;
}
}
请注意,虽然你总是可以注入的注射器,你应该只这样做的时候,你真的不知道你需要什么样的执行情况(喜欢这里)。一般而言,如果您想延迟创建,您应该注入SomeInstance
本身或Provider<SomeInstance>
。
我们有类似的要求一次,所以我们所做的就是使用工厂模式,并使用弹簧加全部实现工厂类实现。
这种方式,当运行时我们会知道使用哪个实现,我们会打电话给我的工厂来提供实现类。另外,无论何时你有更多的实现,你都可以更新工厂类的弹簧组态。
这可能不符合您的设计要求,但这解决了我们的目的。
干杯!