2013-07-16 123 views

回答

1

实现需要根据输入而有所不同,在某些时候,您将不得不将输入解析为某种类。

如果你想让这个映射生活在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>

0

我们有类似的要求一次,所以我们所做的就是使用工厂模式,并使用弹簧加全部实现工厂类实现。

这种方式,当运行时我们会知道使用哪个实现,我们会打电话给我的工厂来提供实现类。另外,无论何时你有更多的实现,你都可以更新工厂类的弹簧组态。

这可能不符合您的设计要求,但这解决了我们的目的。

干杯!