我有一个第三方数据库客户端,我希望Guice创建并管理单例实例,然后需要注入。
据我所知,使用Guice我可以注入一个“对象”,在这种情况下,它是一个使用接口和实现的数据库客户端。但是有可能让Guice直接创建并提供单例数据库客户端,就像spring允许的那样吗?
答案 0 :(得分:2)
对'直接创建'部分不太确定,但至少有两个选项来创建单例:
<强> 1。注释实现
interface DbClient {
}
@Singleton
class DbClientImpl implements DbClient {
}
class DbClientModule extends AbstractModule {
@Override public void configure() {
bind(DbClient.class).to(DbClientImpl.class);
}
}
<强> 2。绑定为单身
interface DbClient {
}
class DbClientImpl implements DbClient {
}
class DbClientModule extends AbstractModule {
@Override public void configure() {
bind(DbClient.class).to(DbClientImpl.class).in(Singleton.class);
}
}
就个人而言,我更喜欢第二种选择,因为根据上下文,它允许将同一个类用作单身或不依赖。
编辑:由另一个库创建的对象!
没问题。这是你如何处理:
class DbClientModule extends AbstractModule {
@Override public void configure() {
DbClient client = AnotherLibrary.createDbClient();
bind(DbClient.class).toInstance(client);
}
}
编辑2:如果我想提供的对象不可用,该怎么办?
也没问题。这是人们可以做的事情:
public static void main(String[] args) {
DbClient client = SomeWeirdPlace.getDbClient();
Injector injector = Guice.createInject(new MyModule(client));
injector.getInstance(ServerInterface.class).start();
}
class MyModule extends AbstractModule {
MyModule(DbClient client) {
this.client = client;
}
@Override public void configure() {
bind(Client.class).toInstance(client);
}
}