Java 使用Guice';将同一参数绑定到多个实现;s多粘合剂和辅助注射

Java 使用Guice';将同一参数绑定到多个实现;s多粘合剂和辅助注射,java,guice,Java,Guice,我有一组验证程序类,它们都扩展了一个公共抽象类,都使用相同的构造函数 公共抽象类抽象验证器{ 公共抽象验证器(数据源数据源){ // ... } } 公共类验证器1扩展了AbstractValidator{ 公共验证器1(数据源数据源){ 超级(数据源); } } 公共类验证器2扩展了AbstractValidator{ 公共验证器2(数据源数据源){ 超级(数据源); } } 我想让Guice有能力 知道如何构造所有这些验证器,将相同的数据源注入所有验证器 使用 通过谷歌搜索,看起来我可以使

我有一组验证程序类,它们都扩展了一个公共抽象类,都使用相同的构造函数

公共抽象类抽象验证器{
公共抽象验证器(数据源数据源){
// ...
}
}
公共类验证器1扩展了AbstractValidator{
公共验证器1(数据源数据源){
超级(数据源);
}
}
公共类验证器2扩展了AbstractValidator{
公共验证器2(数据源数据源){
超级(数据源);
}
}
我想让Guice有能力

  • 知道如何构造所有这些验证器,将相同的数据源注入所有验证器
  • 使用
  • 通过谷歌搜索,看起来我可以使用
    AssistedInject
    ,但问题是如果我想这样做,我必须为每个验证器建立一个工厂,这是一个庞大的样板文件。因为它们都有相同的构造函数,我觉得一定有更好的方法。我的
    DataSource
    对象是在Guice之外创建的,我只想将它绑定到我的
    configure
    DataSource.class
    的所有实例

    我愿意改变的一件事是使用某种工厂方法,它允许我仅从
    数据源
    创建验证器。。。我认识到我希望使用构造函数可能不是类型安全的


    看起来很像我想要的,但它是在Scala中,我对Scala不够熟悉,无法完全理解。

    没有必要使用AssistedInject

    您可以像这样绑定
    数据源的实例:

    DataSource dataSource = ...;
    Injector injector = Guice.createInjector(new AbstractModule() {
      @Provides @Singleton DataSource provideDataSource() { return dataSource; }
      @ProvidesIntoSet Validator provideValidator1(DataSource dataSource) { return new Validator1(dataSource); }
      @ProvidesIntoSet Validator provideValidator2(DataSource dataSource) { return new Validator2(dataSource); }
    });
    
    Set<Validator> validators = injector.get(new Key<Set<Validator>>(){});
    
    数据源数据源=。。。; Injector=Guice.createInjector(新抽象模块(){ @提供@Singleton DataSource provideDataSource(){return DataSource;} @ProvidesIntoSet验证程序provideValidator1(数据源数据源){返回新的验证程序1(数据源);} @ProvidesIntoSet验证程序provideValidator2(数据源数据源){返回新的验证程序2(数据源);} }); Set validators=injector.get(new Key(){});