java – Guice运行时依赖参数重新注入

前端之家收集整理的这篇文章主要介绍了java – Guice运行时依赖参数重新注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
关于Guice的问题.我还在学习它,但我能理解基础知识.

这个问题已经在网上问了好几次,但从来没有一个具体的答案(没有我能找到).

假设我的情况就像图片一样(类似的例子就是在网上).

public class Dog {}

public class Walk implements Walkable {
    private final Dog dog;
    private final boolean leash;

    @Inject
    public Walk(Dog dog,@Assisted boolean leash) {
        this.dog = dog;
        this.leash = leash;
    }

    public void go() {
    }
}

public interface Walkable {
    void go();
}

public interface WalkFactory {
    Walk create(boolean leash);
}

public class AssistedMain {
    public static void main(String[] args) {
        Injector i = Guice.createInjector(new AbstractModule() {
            protected void configure() {

                install(new FactoryModuleBuilder().
                        implement(Walkable.class,Walk.class).
                        build(WalkFactory.class));
            }
        });

        Walk walk = i.getInstance(WalkFactory.class).create(true);
    }
}

这一切都很棒.但问题是 – 我可以以某种方式将该对象实例重新注入“容器”(注入器),以便在依赖此依赖关系的类上使用.

所以,让我们添加一个接口Person,类PersonImpl.

新类源是:

public interface Person {
    void walkDog();
}

public class PersonImpl implements Person {
    private Walkable walkable;

    @Inject
    public PersonImpl(Walkable walkable) {
        this.walkable = walkable;
    }

    public void setWalkable(Walkable walkable) {
        this.walkable = walkable;
    }

    public void walkDog() {
        walkable.go();
    }
}

所以,问题是 – 我能以某种方式将这个特定实例注入到添加的对象中.这是一个简单的例子,但我们可以假设这个类下面有10个级别的类.

我找到的解决方案不是很灵活.就像是:

Injector i = Guice.createInjector(new SimpleModule(false,dog));

然后绑定到具体实例.那不是很有活力.基本上,每次我需要不同的运行时/动态参数时,我都必须重新创建注入器.

提供者< T>很好,FactoryModuleBuilder有帮助,但我怎样才能将对象注入?

这个问题有更动态的解决方案吗?

谢谢.

解决方法

MPierce – 同意了.我试着解释一下我将问题想象的方式(如果我错了,你可以纠正我).

最初源于“服务定位器”模式,它可以管理多于服务的想法至少可以说是乐观的.

我们可以将应用程序拆分为服务和数据类,或者您可以说我们有应用程序和基础结构代码 – “依赖注入”,这是一本很棒的书.

因此,基本上,依赖注入和依赖注入框架通常都很棒.用于解决基础架构或“服务”代码.

注入Container / Injector的任何动态(运行时)参数都基本上迫使您结束对象图.

例如,我们有以下设计:

EmailMessage是一个运行时参数.它可以“注入”Container / Injector之外的电子邮件服务,但它会结束对象图.如果我们想要请求EmailDispatcher,在我们将EmailMessage注入EmailService之后(我重复一次,在注入器外部完成),我们就无法再从注入器中获取EmailDispatcher.

然后,您可以重新设计模型,使其“适合”动态参数的Container / Injector概念.

但话说回来,你强迫设计,突然之间,EmailDispatcher有太多的责任.它可以用在这样的环境中,你没有很多基础设施类.

当你在第三个示例图片中有一个类似于你的设计时,你不能使用Injector / Container来获取NextService3实例(也不能低于EmailDispatcher的级别).

问题是 – 如果你有任何动态(运行时)参数,你只能对需要动态参数的类上面的类使用依赖注入,你可以忘记下面的类.

唷.

正确?

原文链接:https://www.f2er.com/java/129823.html

猜你在找的Java相关文章