複数DB接続のmybatis

iBATIS3(mybatis) Configration.xml に、複数のDB接続先を書いた認識が、
成功したので、Google guice での Module を用意してみた

http://blog.zaq.ne.jp/oboe2uran/article/459/ がベースになっている

import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;
import com.google.inject.multibindings.MapBinder;
/**
 * 複数DB接続用、SqlSessionFactory または、トランザクション インターセプタをバインド.
 */

public class MultiIBatisModule extends AbstractModule{
   private SpiConfiguration spiConfiguration;

   public MultiIBatisModule(){
      this.spiConfiguration = SpiConfiguration.getInstance();
   }
   /*
    * @see com.google.inject.AbstractModule#configure()
    */

   @Override
   protected void configure(){
      binder().bind(String.class).annotatedWith(DefaultEnviroment.class)
      .toInstance(getSpiConfiguration().getDefaultEnviroment());
      Injector injector = Guice.createInjector(new AbstractModule(){
         @Override
         protected void configure(){
            MapBinder<String,SqlSessionFactory> factoryBinder
= MapBinder.newMapBinder(binder(),String.class,SqlSessionFactory.class,ControleSession.class);

            try{
            for(String name : getSpiConfiguration().enviromentNames()){
               factoryBinder.addBinding(name)
.toInstance(new SqlSessionFactoryBuilder().build(
        Resources.getResourceAsReader(MultiIBatisModule.this.configXmlName),name));

            }
            }catch(IOException e){
               throw new RuntimeException(
"Configration SqlSessionFactory bind Error : "+e.getMessage(),e);
            }
         }
      }
   );
   binder().bindInterceptor(Matchers.any(),Matchers.annotatedWith(Transaction.class)
                           ,injector.getInstance(MxTransactionExecutor.class));
   binder().bindInterceptor(Matchers.any(),Matchers.annotatedWith(QueryLimited.class)
                           ,injector.getInstance(MxQueryLimitedExecutor.class));
   }
   protected SpiConfiguration getSpiConfiguration(){
      return this.spiConfiguration;
   }

}
------------------------------
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.google.inject.Inject;
/**
 * 複数DB接続のSqlSession 実行の抽象クラス
 *
 * Configuration の Envioment名を指定して複数接続できる
 */

public abstract class MultiIBatisDao{
   @ControleSession private Map<String,SqlSession> map;
   @Inject @DefaultEnviroment private String defaultEnviromentName;

   public SqlSession getSqlSession(){
      return this.map.get(this.defaultEnviromentName);
   }
   public SqlSession getSqlSession(String enviromentName){
      return this.map.get(enviromentName);
   }
   public <T> T getMapper(Class<T> t){
      return this.map.get(this.defaultEnviromentName).getMapper(t);
   }
   public <T> T getMapper(Class<T> t,String enviromentName){
      return this.map.get(enviromentName).getMapper(t);
   }
}