guice:多个实现,不同的对象图

时间:2011-10-26 19:48:08

标签: guice robot-legs-problem

你如何在guice中做以下事情?

XmlSerializer取决于接口XmlFormatterXmlFormatter有两种实现:CompactXmlFormatterPrettyXmlFormatter

另一个班级MyApplication取决于XmlSerializer的2个实例。应使用CompactXmlFormatter和另一个PrettyXmlFormatter

配置一个实例
public class XmlSerializer {
    public XmlSerializer(XmlFormatter formatter) {
       ...
    }
}

public interface XmlFormatter {
    ...
}

public class CompactXmlFormatter implements XmlFormatter {
    ...
}

public class PrettyXmlFormatter implements XmlFormatter {
    ...
}

public class MyApplication {
    public MyApplication(XmlSerializer compactSerializer, XmlSerializer prettySerializer) {
        ...
    }
}

你如何构建这样的图表?

我知道,一旦你拥有2个XmlSerializer个实例,将它们注入MyApplication需要在MyApplication构造函数的参数中注释。

我更感兴趣的是如何将XmlFormatter绑定到CompactXmlFormatterPrettyXmlFormatter

1 个答案:

答案 0 :(得分:0)

使用绑定注释来区分每个XmlFormatter

Module

bind(XmlFormatter.class).aannotatedWith(Pretty.class)
    .to(PrettyXmlFormatter.class);
bind(XmlFormatter.class).aannotatedWith(Compact.class)
    .to(CompactXmlFormatter.class);

@Inject public MyApplication(
    @Compact XmlSerializer compactSerializer, 
    @Pretty XmlSerializer prettySerializer) {
    ...

当然,您必须定义@Pretty@Compact注释:

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface Pretty {}

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface Compact {}