使用Google Guice注入构造函数参数值

时间:2017-02-24 07:19:09

标签: parameter-passing guice inject

我有一个简单的要求 -

这是我想要注入CalledService的对象的服务。

public class CallingService {

    private CalledService service;

    @Inject
    public CallingService(CalledService svc) {
        service = svc;
    }
}

CalledService看起来像这样 -

public class CalledService {

    private String variable_value;

    public CalledService(String parameter) {
        variable_value = parameter;
    }

}

让我们在psvm中说,我正在编写此代码以供执行 -

Injector injector = Guice.createInjector(new AppInjector());        
CallingService service = injector.getInstance(CallingService.class);

问题是如果CalledService有一个非参数化的构造函数,那么它可以正常工作。但由于它是参数化的,我不知道如何注入参数值。

此外,其他一些服务可能希望使用不同的参数值注入CalledService。所以我不想将任何静态值绑定到参数。

有人能建议使用Google Guice实现最简单的方法吗?此外,我在这个论坛上找到了很多答案,但它们并不是我想要的,而且有些解决方案过于复杂。提前谢谢。

3 个答案:

答案 0 :(得分:1)

谢谢,@ Luigi和@vsbehere帮助我。我还浏览了你们之前分享过的stackoverflow链接。

那里提到的答案对我来说似乎有点复杂,我希望使用Google Guice注入参数的方法更简单一些。我非常耐用的一件事是工厂级,我想知道它的用法是否可以避免。然后我经历了这个documentation,我对我有意义。

总结一下,FactoryInterface的目的是帮助Guice构建对象。 AssistedInjectcreate()方法的参数映射到实现类的构造函数中的相应@Assisted参数,在此示例中,实现类是CalledService。 Factory Interface中的create()方法仅使用辅助参数,并且应确保它们与构造函数中的顺序相同。

我希望上一段有意义,这就解释了为什么需要一个因子类。这就是我解决上述问题的方法 -

CalledService现在看起来像这样,参数中现在有一个@Assisted关键字 -

public class CalledService {

    private String variable_value;

    @Inject
    public CalledService(@Assisted String parameter) {
        variable_value = parameter;
    }

    public void printValue() {
        System.out.println(variable_value);
    }
}

CalledServiceFactory是一个新添加的,其目的是创建CalledService的对象。这就是它的样子 -

public interface CalledServiceFactory {

    CalledService create(String var);
}

CallingService现在看起来像这样,我们现在正在向此类注入CalledServiceFactory实例,这有助于创建CalledService的实例 -

public class CallingService {

    @Inject
    private CalledServiceFactory factory;

    public void callingMethod() {
        CalledService service = factory.create("someValue");
        service.printValue();
    }
}

在模块内部,我配置了CalledServiceFactory -

public class AppInjector extends AbstractModule {

    @Override
    protected void configure() {
        install(new FactoryModuleBuilder()
                 .build(CalledServiceFactory.class));
    }
}

最后,为了执行它,这就是我在main函数中执行它的方式 -

private static void main() {
        Injector injector = Guice.createInjector(new AppInjector());
        CallingService service = injector.getInstance(CallingService.class);
        service.callingMethod();
}

这就是我实现它的方式,这是我可以最简单的修改它。如果有人有任何最佳解决方案,请告诉我。

答案 1 :(得分:0)

除了上述评论中的建议外 - assisted inject 您可以在Guice中绑定实例。有关详情/示例

,请参阅here

希望这有帮助

答案 2 :(得分:0)

我害怕你转错了。相反,请看一下提供方法(同样,使用界面绑定来释放Guice'全部潜力!):

public interface CallingService {

    void requestStuffExecution();
}

接口1:

public interface CalledService {

    void doStuff();
}

接口2:

import com.google.inject.Inject;

public class DefaultCallingService implements CallingService {

    private DefaultCalledService service;

    @Inject
    public DefaultCallingService(DefaultCalledService svc) {
        service = svc;
    }

    @Override
    public void requestStuffExecution() {
        service.doStuff();
    }
}

默认Impl1:

import com.google.inject.Inject;

public class DefaultCalledService implements CalledService {

    private String parameter;

    @Inject
    public DefaultCalledService(String par) {
        this.parameter = par;
    }

    @Override
    public void doStuff() {
        System.out.println("Oh boy, always so much stuff to do! Performing: " + parameter);
    }
}

默认Impl2:

Cron.run

打印:"哦,男孩,总是这么多东西要做!执行:<输入字符串>"。