我有一个第 3 方数据库客户端,我想让 Guice 创建和管理一个单例实例,然后需要注入。
我知道使用 Guice 我可以注入一个“对象”,在这种情况下,它是一个使用接口和实现的数据库客户端。但是是否有可能让 Guice 直接创建并提供单例数据库客户端,就像 spring 允许的那样?
我有一个第 3 方数据库客户端,我想让 Guice 创建和管理一个单例实例,然后需要注入。
我知道使用 Guice 我可以注入一个“对象”,在这种情况下,它是一个使用接口和实现的数据库客户端。但是是否有可能让 Guice 直接创建并提供单例数据库客户端,就像 spring 允许的那样?
不太确定“直接创建”部分,但至少有两个选项可以创建单例:
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);
}
}