如何在Guice中创建一个使用带有标志的构造函数的单例?

时间:2016-07-26 14:36:48

标签: guice

所以我有一个mapper类:

public class TmaticMapper implements Mapper {

private static final long serialVersionUID = 42L;
private static final Logger log = LoggerFactory.getLogger(TmaticMapper.class);
private MapperFactory mf = null;
private MapperFacade mapperFacade = null;
private Map<String, List<String>> toDoList = new HashMap<String, List<String>>();

public TmaticMapper(Configuration propKey) {
    super();
    this.mf = this.buildMapperFactory(propKey.toString());
    this.mapperFacade = mf.getMapperFacade();
}

我需要用作单身人士。这个类是用两种方式构造的,但我只需要一个(我真的只想做一个。它正在做一些事情,比如改变字节代码,我只想让它按照每个jvm做一次)。我试过&#34; @ Singleton&#34;等等,但我在启动时没有看到任何差异。

我使用此实例化:

binder.bind(Mapper.class).annotatedWith(Names.named("RecordToDto")).toInstance(new TmaticMapper(Mapper.Configuration.recordToDto));

并以这种方式注入:

@Inject
    @Named("RecordToDto")
    private Mapper tMapper;

如何在启动时仅实例化其中一个并注入它?

1 个答案:

答案 0 :(得分:0)

尝试使用@Provides创建提供程序,而不是使用模块config()方法中的绑定语法。这将允许您向提供程序返回的单例添加一些逻辑。

示例模块:

public class YourModule extends AbstractModule {

  private Config config

  public YourModule(Config config) {
    this.config = config;
  }

  @Override 
  protected void configure() {/*prefer providers*/}

  @Provides
  @Singleton 
  public TmaticMapper providesTmaticMapper(Config config) {
    if (myflag) {
      return new TmaticMapper(config);
    }
    else {
      return new TmaticMapper(config);
    }
  }
}

创建您的注射器:

Injector injector = Guice.createInjector(new YourModule(config));

获取你的单身人士的实例:

TmaticMapper mapper = injector.getInstance(TmaticMapper.class);

每次在该注射器上调用getInstance()时,您都会收到TmaticMapper的相同实例。如果您创建另一个注入器,您将获得一个新实例,该实例将作用于该注入器。