Guice:通过方法创建对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guice:通过方法创建对象相关的知识,希望对你有一定的参考价值。
假设我有两个相似(但可能不同)的方法(或者可能是静态方法)create_x()
和create_y()
来创建类x
(类派生)的对象(称为y
和Parser
)。
现在我想绑定由这两个方法创建的对象,如在answer to my previous question中:
bind(Parser.class)
.annotatedWith(Names.named("x"))
.to(ParserXImplementation.class);
bind(Parser.class)
.annotatedWith(Names.named("y"))
.to(ParserYImplementation.class);
但是由create_x()
创建的对象,create_y()
而不是类ParserXImplementation
,ParserYImplementation
的实例。 (因此没有必要创建类ParserXImplementation
,ParserYImplementation
。)
请注意,我希望对象是单例。
如果create_x()
,create_y()
是静态方法,并且如果它们是实例方法,我希望得到答案。如果它们是实例方法,则包含它们的类本身可能会受到依赖注入。
这该怎么做? (将依赖项注入方法创建的实例)
来自https://github.com/google/guice/wiki/ProvidesMethods:
当您需要代码来创建对象时,请使用@Provides
方法。该方法必须在模块中定义,并且必须具有@Provides
注释。方法的返回类型是绑定类型。只要注入器需要该类型的实例,它就会调用该方法。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
...
}
@Provides
TransactionLog provideTransactionLog() {
DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();
transactionLog.setJdbcUrl("jdbc:mysql://localhost/pizza");
transactionLog.setThreadPoolSize(30);
return transactionLog;
}
}
此外,它说它可以使用像@Named("x")
和@Named("y")
这样的注释来区分x
和y
,如Binding the same interface twice (Guice)的答案所述。
这就是我需要的(但是该方法是在模块内定义的,而不是在任意类中定义的)。
以上是关于Guice:通过方法创建对象的主要内容,如果未能解决你的问题,请参考以下文章