簡體   English   中英

如何使用guice自動安裝接口的所有實現?

[英]How to auto install all implementations of an interface with 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));

And和“ Or過濾器僅是示例,但我還有更多示例,其中一些需要注入特定對象,因此需要注入工廠。

Guice是否可以只說“安裝IFilterFactory所有實現”而不必自己使用反射?

沒有內置的類路徑掃描功能 ,盡管有很多現有的庫選項 ,但我們有理由相信Java根本不存在完美的解決方案 無論如何,即使在頻繁使用的庫中,枚舉所有可用的類也是很慢的 ,這種解決方案將根據應用程序中類的數量而不是所使用的過濾器的數量來擴展。

(要清楚,您甚至沒有要求“安裝IFilterFactory的所有實現”,而是要求“使用FactoryModuleBuilder為IFilterFactory的所有實現創建和安裝模塊。”工廠接口實現直到您使用FactoryModuleBuilder生成它。)

但是,您可以提取除類名本身之外的所有內容,因此您只有一個易於維護的要綁定的類列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM