Wicket 1.5 と Google guice 3.0

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);
   }
}
のようにする。