我对Guice说道,试图抓住Guice提供的依赖注入。我想将接口实现注入Cache的一部分。下面的代码片段是我目前实现的:
class CacheModule extends AbstractModule {
@Override
public void configure() {
bind(DBService.class).to(DBServiceImpl.class);
}
@Provides
@Singleton
@com.google.inject.name.Named("CacheName")
public LoadingCache<String, Object> getCache() {
DBService dbservice = new DBServiceImpl();
LoadingCache<String, Object> result = CacheBuilder.newBuilder()
.maximumSize(100).expireAfterAccess(10, TimeUnit.SECONDS)
.build(new CacheLoader<String, Object>() {
@Override
public String load(String key) throws Exception {
return dbservice.getData(1);
}
});
return result;
}
}
这是初始化DBService dbservice = new DBServiceImpl();
的当前方法,以便可以在缓存的dbservice
方法中使用对象load()
吗?它似乎就像是试图在模块中注入seviceImpl的循环循环
将来,我想轻松一点,以便我可以创建dbService
,可以引用实现DBService
的其他对象类型。
由于
答案 0 :(得分:0)
您可以使用injections将DBService
impl注入自定义CacheProvider
课程,例如
class CacheModule extends AbstractModule {
@Override
public void configure() {
bind(DBService.class).to(DBServiceImpl.class);
}
}
class CacheProvider {
private DBservice dbservice;
@Inject
CacheProvider(DBservice dbservice) {
this.dbservice = dbservice;
}
@Provides
@Singleton
@com.google.inject.name.Named("CacheName")
public LoadingCache<String, Object> getCache() {
LoadingCache<String, Object> result = CacheBuilder.newBuilder()
.maximumSize(100).expireAfterAccess(10, TimeUnit.SECONDS)
.build(new CacheLoader<String, Object>() {
@Override
public String load(String key) throws Exception {
return dbservice.getData(1);
}
});
return result;
}
}
public static void main(String[] args) {
/*
* Guice.createInjector() takes your Modules, and returns a new Injector
* instance. Most applications will call this method exactly once, in their
* main() method.
*/
Injector injector = Guice.createInjector(new CacheModule());
/*
* Now that we've got the injector, we can build objects.
*/
CacheProvider cacheProvider = injector.getInstance(CacheProvider.class);
cacheProvider.getCache();
...
}
现在,您可以使用CacheProvider
来获取使用DBService
方法绑定的main
impl的缓存。