Java 在Guice中将参数传递给构造函数,而不修改接口/Impl类

Java 在Guice中将参数传递给构造函数,而不修改接口/Impl类,java,spring,dependency-injection,guice,Java,Spring,Dependency Injection,Guice,我想在Guice中使用Impl绑定接口时传递构造函数参数 有两种解决方案,但我没有访问这些接口/Impl的代码。 它们是由其他团队开发的,我已经将它们包括在我的项目中 @Named/@Assisted-两者都需要更改Impl的源代码(构造函数)以包含这些注释。(我没有访问此代码的权限) ImplementProvider-通过加载所需参数返回该Impl的实例。这起作用了。 但问题是我有200多个这样的现有DI,我必须编写200多个提供者 目前我们正在使用SpringDI,并且正在迁移到Guice

我想在Guice中使用Impl绑定接口时传递构造函数参数

有两种解决方案,但我没有访问这些接口/Impl的代码。 它们是由其他团队开发的,我已经将它们包括在我的项目中

  • @Named/@Assisted-两者都需要更改Impl的源代码(构造函数)以包含这些注释。(我没有访问此代码的权限)
  • ImplementProvider-通过加载所需参数返回该Impl的实例。这起作用了。 但问题是我有200多个这样的现有DI,我必须编写200多个提供者
  • 目前我们正在使用SpringDI,并且正在迁移到Guice。 所以我需要定义一些东西,比如

    <bean name="clientWrapper" class="com.wrapper.client.ClientWrapper">
        <constructor-arg index="0" value="${server.ip}" />
        <constructor-arg index="1" value="${server.port}" />
    </bean>
    

    如何在不使用提供商的情况下实现这一点?

    我认为最好的选择是混合使用和

    如果对象的依赖项不能单独按类型计算,请使用
    @提供的
    方法绑定

    public class ProvidesModule extends AbstractModule {
        @Provides
        IClientWrapper clientWrapper(@Named("server.ip") String ip,
                                     @Named("server.port") int port) {
           return new ClientWrapper(ip, port);
        }
    }
    
    在总体代码大小上,这并没有明显超过Spring,并且是类型安全的

    当构造函数只有依赖项可以通过类型单独计算时,则使用toConstructor绑定

    protected void configure() {
        try {
          bind(TransactionLog.class).toConstructor(
              DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));
        } catch (NoSuchMethodException e) {
          addError(e);
        }
    }
    
    最后一个选择:

    我们的遗产:

    interface LegacyThing {
    }
    
    class LegacyThingImp implements LegacyThing {
        public LegacyThingImp(String test) {
            System.out.println(test);
        }
    }
    
    是我的魔法提供者。这将获取一个实现类和依赖项列表(如
    Key
    s),然后通过Magic(或反射)找到正确的构造函数

    公共类TestMagic{
    公共静态void main(最终字符串…arg){
    Guice.createInjector(
    新抽象模块(){
    @凌驾
    受保护的void configure(){
    bind(String.class).annotatedWith(Names.named(“testString”)).toInstance(“Guice!”);
    bind(LegacyThing.class).toProvider(新的MagicLegacyProvider(legacythingingmp.class,Key.get(String.class,Names.named(“testString”)));
    }
    }).getInstance(LegacyThing.class);
    }
    }
    
    我认为您最好的选择是混合使用和

    如果对象的依赖项不能单独按类型计算,请使用
    @提供的
    方法绑定

    public class ProvidesModule extends AbstractModule {
        @Provides
        IClientWrapper clientWrapper(@Named("server.ip") String ip,
                                     @Named("server.port") int port) {
           return new ClientWrapper(ip, port);
        }
    }
    
    在总体代码大小上,这并没有明显超过Spring,并且是类型安全的

    当构造函数只有依赖项可以通过类型单独计算时,则使用toConstructor绑定

    protected void configure() {
        try {
          bind(TransactionLog.class).toConstructor(
              DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));
        } catch (NoSuchMethodException e) {
          addError(e);
        }
    }
    
    最后一个选择:

    我们的遗产:

    interface LegacyThing {
    }
    
    class LegacyThingImp implements LegacyThing {
        public LegacyThingImp(String test) {
            System.out.println(test);
        }
    }
    
    是我的魔法提供者。这将获取一个实现类和依赖项列表(如
    Key
    s),然后通过Magic(或反射)找到正确的构造函数

    公共类TestMagic{
    公共静态void main(最终字符串…arg){
    Guice.createInjector(
    新抽象模块(){
    @凌驾
    受保护的void configure(){
    bind(String.class).annotatedWith(Names.named(“testString”)).toInstance(“Guice!”);
    bind(LegacyThing.class).toProvider(新的MagicLegacyProvider(legacythingingmp.class,Key.get(String.class,Names.named(“testString”)));
    }
    }).getInstance(LegacyThing.class);
    }
    }
    
    我也这么想。我想除了供应商,我没有其他选择。完美的解决方案。提供构造函数注入而不创建多个提供程序类的通用方法。但其中的一个问题是,为什么我们还需要实现hasDependencies呢?它在这里意味着什么,因为我们在提供者类中使用泛型。就我个人而言,我不认为魔术比提供者方法好多少。每个提供程序方法只有4行,并且是类型安全的。嗯,我过去没有使用过
    hasDependencies
    。所以在我的产品代码中使用它有点犹豫。我试图为hasDependencies搜索一些参考资料,但没有多大帮助。你能给我一些链接让我看看吗?让我们看看。我也这么想。我想除了供应商,我没有其他选择。完美的解决方案。提供构造函数注入而不创建多个提供程序类的通用方法。但其中的一个问题是,为什么我们还需要实现hasDependencies呢?它在这里意味着什么,因为我们在提供者类中使用泛型。就我个人而言,我不认为魔术比提供者方法好多少。每个提供程序方法只有4行,并且是类型安全的。嗯,我过去没有使用过
    hasDependencies
    。所以在我的产品代码中使用它有点犹豫。我试图为hasDependencies搜索一些参考资料,但没有多大帮助。你能给我提供一些关于它的链接吗?让我们看看。