在Guice模块

时间:2017-09-18 16:35:41

标签: java dependency-injection guice

我对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的其他对象类型。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用injectionsDBService 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的缓存。