Wicket 1.5 RC3 を見て考えました。Wicket - Google guice 3.0 の完全な連携、JSR-330 まで
サポートしないのであれば、自分で GuiceComponentInjector を作ることを考えました。
Wicket 1.5 で配布される wicket-guice の JAR に含まれる GuiceInjectorHolder は最大限
利用し、GuiceFieldValueFactory や、GuiceComponentInjector を自分で用意する。
GuiceFieldValueFactory → CustomGuiceFieldValueFactory
import 文は、、、
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import org.apache.wicket.Application;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.guice.GuiceInjectorHolder;
import org.apache.wicket.injection.IFieldValueFactory;
import org.apache.wicket.proxy.IProxyTargetLocator;
import org.apache.wicket.proxy.LazyInitProxyFactory;
import org.apache.wicket.util.lang.WicketObjects;
import com.google.inject.BindingAnnotation;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
class 宣言は、、
class CustomGuiceFieldValueFactory implements IFieldValueFactory , Serializable{
オーバーライドするpublic Object getFieldValue(final Field field, final Object fieldOwner) の中で、
既存の処理、com.google.inject.Inject だけでなく、javax.inject.Inject も処理するようにすれば良い。
オーバーライドする supportsField メソッドは、、、
@Override
public boolean supportsField(final Field field){
return field.isAnnotationPresent(com.google.inject.Inject.class)
|| field.isAnnotationPresent(javax.inject.Inject.class);
}
バインディングアノテーションにチェックも、javax.inject.Named のチェックを行えば良い。
GuiceProxyTargetLocator は、CustomGuiceFieldValueFactory のインナークラスにしてしまう。
詳細は、こちらで。。
GuiceComponentInjector → CustomGuiceComponentInjector
public class CustomGuiceComponentInjector extends org.apache.wicket.injection.Injector
implements IComponentInstantiationListener{
private final IFieldValueFactory fieldValueFactory;
// 省略
public CustomGuiceComponentInjector(final Application app, final Injector injector,final boolean wrapInProxies){
app.setMetaData(GuiceInjectorHolder.INJECTOR_KEY, new GuiceInjectorHolder(injector));
this.fieldValueFactory = new CustomGuiceFieldValueFactory(wrapInProxies);
bind(app);
}
@Override
public void inject(final Object object){
inject(object,this.fieldValueFactory);
}
@Override
public void onInstantiation(final Component component){
inject(component);
}
}
のようにする。