FactoryProvider

guice-assistedinject-2.0.jar に存在する FactoryProvider を使うと、
Injector から getInstance 実行後、FactoryProvider で注入したファクトリ実行で、
任意の引数を与えることができる。Injector のバインド定義で目的の
生成に必要なインスタンス注入の他にファクトリとして注入させるもの、
混在が可能になる。

-------------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;

public class FooImpl implements Foo{
   private int num;
   private String color;
   private String name;
   /**
    * コンストラクタ
    * @param num Injectorのバインド定義で指定する。
    * @param color Injectorのバインド定義で指定する。
    * @param name Injectorが生成するファクトリ実行時に指定する
    */
   @Inject
   public FooImpl(int num,String color,@Assisted String name){
      this.num = num;
      this.color = color;
      this.name = name;
      System.out.println("## FooImpl constructor!");
   }

   @Override
   public String getName(){
      return this.name;
   }
   @Override
   public int getNum(){
      return this.num;
   }
   @Override
   public String getColor(){
      return this.color;
   }
}
-------------------------------------------------------------
/**
 * FooImpl インターフェース
 */
public interface Foo{
   public int getNum();
   public String getName();
   public String getColor();
}
-------------------------------------------------------------
/**
 * Foo生成ファクトリ、実装クラスは定義しない!
 */
public interface FooFactory{
   public Foo create(String s);
}

-------------------------------------------------------------
/**
 * FooFactoryを実行する役割
 */
public interface FooLookup{
   public Foo lookup(String s);
}

-------------------------------------------------------------
import com.google.inject.Inject;

/**
 * FooFactoryを実行する役割の実装
 */
public class FooLookupImpl implements FooLookup{
   @Inject private FooFactory factory;

   @Override
   public Foo lookup(String name){
      return this.factory.create(name);
   }
}

-------------------------------------------------------------
Injector injector = Guice.createInjector(new AbstractModule(){
      @Override
      protected void configure(){
         binder().bind(int.class).toInstance(124);
         binder().bind(String.class).toInstance("Red");
         binder().bind(FooLookup.class).to(FooLookupImpl.class);
         binder().bind(FooFactory.class)
         .toProvider(FactoryProvider
                    .newFactory(FooFactory.class
,FooImpl.class));

      }
   }
);
FooLookup f = injector.getInstance(FooLookup.class);
Foo foo = f.lookup("aaa");  //←ここで、FooImpl が生成される

System.out.println("Foo#getNum()    = "+foo.getNum());
System.out.println("Foo#getName()   = "+foo.getName());
System.out.println("Foo#getColor()  = "+foo.getColor());