如何使用guice自动安装接口的所有实现?

时间:2016-08-09 08:48:55

标签: java dependency-injection guice

我有以下界面:

public interface IFilterFactory<T extends IFilter> {
    T create(IFilterConfig config);
}

它的多个实现:

public class AndFilter implements IFilter {
    public interface IAndFilterFactory extends IFilterFactory<AndFilter> {}

    // ...
}

public class OrFilter implements IFilter {
    public interface IOrFilterFactory extends IFilterFactory<OrFilter> {}

    // ...
}

在我的Guice模块中,我正在安装我以这种方式添加的每个模块:

install(new FactoryModuleBuilder().build(IAndFilterFactory.class));
install(new FactoryModuleBuilder().build(IOrFilterFactory.class));

AndOr过滤器只是示例,但我还有更多,其中一些需要注入特定对象,因此工厂。

有没有办法让Guice只是说“安装IFilterFactory的所有实现”而不必自己使用反射?

1 个答案:

答案 0 :(得分:0)

nothing for classpath scanning built-in,尽管有a lot of existing library options,但仍有理由相信a perfect solution simply can't exist for Java。在任何情况下,即使在频繁使用的库中,枚举所有可用的类也是known to be slow,并且这样的解决方案将根据应用程序中的类数量而不是您使用的过滤器数量进行扩展。

(很明显,你甚至不想要“安装IFilterFactory的所有实现”,你要求“为IFilterFactory的所有实现创建并安装带有FactoryModuleBuilder的模块”。工厂接口实现不在使用FactoryModuleBuilder生成它之前一直存在。)

但是,您可以从类名本身中提取所有内容,因此您只需要一个易于维护的类列表来绑定:

List<Class<?>> filterFactories = ImmutableList.<Class<?>>of(
    IAndFilterFactory.class,
    IOrFilterFactory.class,
    IXorFilterFactory.class,
    HelpIAmTrappedInAFilterFactory.class
);
for (Class<?> clazz : filterFactories) {
  install(new FactoryModuleBuilder().build(clazz));
}