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

消费者包的Guice绑定

邹高峻
2023-03-14

我是Guice的新手,正在为以下用例寻求帮助:

开发了一个软件包(PCKG),其中该软件包的入门级依赖于其他类,例如:

A : Entry point class --> @Inject A(B b) {}
B in turn is dependent on C and D like --> @Inject B(C c, D d) {}

在我的绑定模块中,我正在做:

bind(BInterface).to(Bimpl);
bind(CInterface).to(CImpl);
...

注意我没有为A提供绑定信息,因为我想通过它的消费者类来提供它的绑定。(设计就是这样,所以我的要求是继续讨论主要问题,而不是设计)。

现在,我的消费者阶层正在做这样的事情:

AModule extends PrivateModule {
    protected void configure() {
        bind(AInterface.class).annotatedWith(AImpl.class);
    }
}

同样在我的消费者包装中:

.(new PCKGModule(), new AModule())

Q1。我在消费者类中做的绑定正确吗?我很困惑,因为当我在我的消费者包装中进行如下内部测试时:

class testModule {
    bind(BInterface).to(Bimpl); 
    bind(CInterface).to(CImpl)... 
}

class TestApp {
    public static void main(..) {
        Guice.createInstance(new testModule());
        Injector inj = Guice.createInstance(new AModule());
        A obj = inj.getInstance(A.class);
    }
}

它正在引发Guice创建异常。请帮我摆脱这种情况。另外,我的一个朋友对Guice也很幼稚,他建议我需要使用Provides注释在AModule中创建B的实例。但我真的不明白他的意思。

共有1个答案

尚楚
2023-03-14

您的主要方法应该如下所示:

class TestApp {
public static void main(..) {
    Injector injector = Guice.createInjector(new TestModule(), new AModule());
    A obj = injector.getInstance(A.class);
}

注意,Java惯例是类名的首字母大写。

我很确定您的AModule的实现也没有做您认为它正在做的事情,但根据您提供的信息很难确定。很可能,您打算这样做:

bind(AInterface.class).to(AImpl.class)`

不需要对<code>和<code>的绑定做任何“特殊”的操作。Guice为您解析所有递归。这是它“魔力”的一部分。

annotatedWith()to()toInstance() 一起使用,如下所示:

bind(AInterface.class).to(AImpl.class).annotatedWIth(Foo.class);
bind(AInterface.class).to(ZImpl.class).annotatedWIth(Bar.class);

然后,您可以通过注释注入点来注入不同的实现,例如:

@Inject
MyInjectionPoint(@Foo AInterface getsAImpl, @Bar AInterface getsZImpl) {
    ....
}

还值得指出的是,通过不打扰绑定模块(取决于您的代码的排列方式)和使用JIT绑定,您可以为自己节省一些样板:

@ImplementedBy(AImpl.class)
public interface AInterface {
    ....
}

这些有效地充当“默认值”,如果存在,则被显式绑定覆盖。

 类似资料:
  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • 我花了几个小时想弄清楚发生了什么,但没能找到解决办法。 这是我在一台机器上的设置: 1名zookeeper跑步 我正在使用kafka控制台生成器插入消息。如果我检查复制偏移量(

  • Flink kafka消费者有两种类型的消费者,例如: 这两个消费者层次结构扩展了相同的类。我想知道维护编号类背后的设计决策是什么?我们什么时候应该使用其中一种? 我注意到带有数字后缀的类有更多的特性(例如ratelimiting)。 https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-kafka

  • 我一直在试图理解一种奇怪的OSGI行为。希望有人能解释一下。这是我的设置 1)使用eclipse\plugins\org.eclipse.osgi_3.7.0.v20110613.jar 2) 我有一个导出服务的包(HelloworldService) 它在activator中注册服务 3) 我有一个“消费者”捆绑包,通过ServiceTracker使用该服务 现在,当我将这两个罐部署到OSGI(

  • 我刚接触Kafka,很少阅读教程。我无法理解使用者和分区之间的关系。 请回答我下面的问题。 > 消费者是否由ZK分配到单个分区,如果是,如果生产者将消息发送到不同的分区,那么其他分区的消费者将如何使用该消息? 我有一个主题,它有3个分区。我发布消息,它会转到P0。我有5个消费者(不同的消费者群体)。所有消费者都会阅读P0的信息吗?若我增加了许多消费者,他们会从相同的P0中阅读信息吗?如果所有消费者

  • 我正在Java中实现一个简单的Kafka消费者。代码如下: 我在网上查看的任何文档都给出了range或roundrobin作为可能的分配策略,据我所知,groupId是一个自定义名称。不确定这里什么是正确的配置值。