当前位置: 首页 > 知识库问答 >
问题:

Guice注入在注入层次结构中的某个位置失败

卢聪
2023-03-14

我是Guice的新手,正在尝试在下面的类族中实现依赖注入,如下所示:

class DoSomethingServlet {
    @Inject
    IProvider provider;
}

interface IProvider {

}

@Singleton
class Provider implements IProvider {

    @Inject
    @Named("B")
    IManager manager; 
}

interface IManager {

}

class Manager implements IManager {

    @Inject
    @Named("B")
    IDAO dao;

    @Inject
    @Named("B")
    IConverter converter;
}

interface IDAO {

}

class DAO implements IDAO {

}

interface IConverter {

}

class Converter implements IConverter {

}

import com.google.inject.AbstractModule;

class DoSomethingModule extends  AbstractModule {
    @Override
    protected void configure() {
        bind(IProvider.class).to(Provider.class);
        bind(IManager.class).annotatedWith(Names.named("B"))
            .to(Manager.class);
        bind(IDAO.class).annotatedWith(Names.named("B")).to(DAO.class);
        bind(IConverter.class).annotatedWith(Names.named("B"))
            .to(Converter.class);
    }
}

然而,有一些问题,由于我的请求没有成功。

IDAO dao = new DAO();
IConverter converter = new Converter();

您能否帮助我发现问题,并让我知道您是如何调试Guice中的依赖注入问题的?

共有1个答案

宓弘壮
2023-03-14

您需要通过Guice绑定servlet。为此,您需要遵循以下步骤。

创建一个Servlet模块来添加Servlet绑定。

public class YourServletModule extends ServletModule {
    @Override
    protected void configureServlets() {
        serve("YOUR SERVLET URL").with(DoSomethingServlet.class);
        bind(DoSomethingServlet.class).in(Singleton.class);
    }
}

如果不想创建单独的模块,还可以将servlet映射添加到已经创建的模块中,但需要从ServletModule派生模块。

public class YourContextListener extends GuiceServletContextListener{
    @Override
    public Injector getInjector(){
        return Guice.createInjector(new DoSomethingModule(),new YourServletModule());
    }
}
<listener>
    <listener-class>qualified class name of YourContextListener</listener-class>
</listener>

将guice过滤器添加到web.xml以将过滤器映射到servlet url模式。

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>YOUR SERVLET URL</url-pattern>
</filter-mapping>
 类似资料:
  • 我想引导一系列处理元素,并通过Guice将它们连接在一起。让我们假设以下路径: 需要一些输入 由实现需要 由实现需要 由实现需要 的依赖关系只能在运行时解决,而不能在配置时解决。通常的方法是在这种情况下使用辅助注入来创建工厂,该工厂将缺少的实例作为参数,如下所示: 但我真正想要的是这样的: 我不想在整个层次结构中手动传递AImpl的特定依赖项。使用Guice可以实现这一点吗?如果没有,在保持注射的

  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn

  • 主要内容:输出注入是将依赖注入对象的过程。构造函数注入很常见。在这个过程中,依赖被作为参数注入到构造函数中。请参阅下面的示例。 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 我在注释中创建一些元数据结构时遇到了问题。我们使用注释来定义Hibernate实体属性的特殊属性,但它可能在任何地方都可以使用。我想创建表示这些结构的条件: 问题是我需要使用此注释定义一些“树”结构。这是我想达到的一些设计: 我想根据这个例子使用的所有这些注释: 我知道我在上面的注释定义中定义的那种继承是不可能的。但是,我该如何考虑我的注释和,或是在一个“家庭”中?

  • 我有以下实现,我正在尝试在Guice中注入 这是我的注入代码Injector guice=Guice. Injector();guice.get实例(SomeClass.class); 但我不断地得到错误: 在hello.package.helloworld.客户端中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数或一个非私有的零参数构造函数 如何注入一个已经有参数

  • 我正在使用 scala play 2.5,在尝试在我的一个控制器中注入对象时出现以下错误。我正在使用 play 给出的默认注入框架,即 Guice。 这是控制器: 以下是我想注入的服务: 这就是我使用它的方式: