使用辅助注入创建复杂的依赖树

时间:2013-05-27 21:16:30

标签: java dependency-injection guice assisted-inject

我最近了解到Guice的 AssistedInject 扩展,我认为这对我的一些设计问题来说是一个很好的解决方案。不幸的是,似乎这种解决方案仅限于一级辅助注射。这里有一个我的问题的例子 - 假设我们有三个类:

public class AImpl implements A{

    @AssistedInject
    public AImpl(@Assisted Integer number, B b){

    }
}

public class BImpl implements B {

}

public class CImpl implements C {
    @AssistedInject
    public CImpl(A a){

    }
} 

工厂界面:

public interface CFactory {
    C create(Integer number);
}

和一个模块:

public class ABCModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(A.class).to(AImpl.class);
        bind(B.class).to(BImpl.class);

        install(new FactoryModuleBuilder().implement(C.class, CImpl.class).build(CFactory.class));
    }

    public static void main(String[] args) {
        Guice.createInjector(new ABCModule()).getInstance(CFactory.class).create(123);
    }

}

上面的以下堆栈跟踪失败:

  

线程“main”中的异常com.google.inject.CreationException:Guice   创建错误:

     

1)无法在stack.AImpl中找到合适的构造函数。课程必须   有一个(只有一个)构造函数用@Inject或a注释   零私有构造函数。在   stack.AImpl.class(AImpl.java:12)at   stack.ABCModule.configure(ABCModule.java:14)

     

2)stack.CImpl有@AssistedInject构造函数,但都没有   匹配方法stack.CFactory.create()中的参数。无法   创建AssistedInject工厂。同时定位stack.CImpl   在stack.CFactory.create(CFactory.java:1)

找到stack.C      

2个错误   com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)     在   com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)     在   com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)     在com.google.inject.Guice.createInjector(Guice.java:95)at   com.google.inject.Guice.createInjector(Guice.java:72)at   com.google.inject.Guice.createInjector(Guice.java:62)at   stack.ABCModule.main(ABCModule.java:21)

这显然意味着我对扩展程序要求太多 - 我希望注入器将在依赖树中深入搜索,以搜索@Assisted依赖项。有没有办法做这种辅助注射,还是我需要自己实施我的工厂?

2 个答案:

答案 0 :(得分:0)

这里有一个类似的问题

Guice assisted injection deeper down the dependency hierarchy

您可以在那里找到答案。

答案 1 :(得分:0)

您的代码有几个问题。你需要注射一个" A"进入" C"但你的工厂设置为注入一个整数

public interface CFactory {
    C create(Integer number);
}

此外,我不认为Guice提供了@AssistedInject注释。改为在构造函数上使用@Inject,并使用@Assisted

标记要传入的参数