所以我有一个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;
如何在启动时仅实例化其中一个并注入它?
答案 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
的相同实例。如果您创建另一个注入器,您将获得一个新实例,该实例将作用于该注入器。