先日書いたCometHashMap には、ひと工夫を埋め込みがある。
new 演算子による生成だけでなく Google guice でインジェクト生成できるようにしてある。
CometHashMapのコンストラクタを次のようにしている。
@Inject
public CometHashMap(@CometLiveScorp long checkTime,CometMapper mapper){
これは、以下のように、CometLiveScorp と AbstractModule 継承で成立する。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.google.inject.BindingAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@BindingAnnotation
@interface CometLiveScorp{
}
---------------------------------------------
import com.google.inject.AbstractModule;
/**
* CometHashMap バインド定義モジュール.
*/
public final class CometHashMapModule extends AbstractModule{
private long ticketTime;
private Class<? extends CometMapper> mappercls;
/**
* コンストラクタ
* @param ticketTime クリアする間隔 msec
* @param mappercls Class<? extends CometMapper>任意の処理
*/
public CometHashMapModule(long ticketTime,Class<? extends CometMapper> mappercls){
this.ticketTime = ticketTime;
this.mappercls = mappercls;
}
/*
* @see com.google.inject.AbstractModule#configure()
*/
@Override
protected void configure(){
binder().bind(long.class).annotatedWith(CometLiveScorp.class).toInstance(this.ticketTime);
binder().bind(CometMapper.class).to(this.mappercls);
}
}
--------------------------------------------------------
public class Sample{
@Inject private CometHashMap<String,Integer> map;
:
}
のようなクラス生成で、以下のように使用する。
Injector injector = Guice.createInjector(
new CometHashMapModule(10000L,CometMapperImpl.class)
);
Sample s = injector.getInstance(Sample.class);