こうなってくると永続化層のMyBatisにもインターフェイスを返して欲しくなります。
しかし、MyBatisは初期状態ではデフォルトコンストラクタがないクラスには対応していません。
ObjectFactoryの実装とバインド
この問題を解決するには、ObjectFactoryを実装し、MyBatisModule#bindObjectFactoryTypeメソッドでバインドします。
ObjectFactoryへProviderを注入
せっかくGuiceを採用しているのですから、ObjectFactoryへProviderを注入し、オブジェクトの生成を委譲しましょう。
実装したものが次のクラスです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package myamamoto.sample.mapper; | |
import myamamoto.sample.bean.Person; | |
import org.apache.ibatis.reflection.factory.DefaultObjectFactory; | |
import com.google.inject.Inject; | |
import com.google.inject.Provider; | |
class BeanObjectFactory extends DefaultObjectFactory { | |
private static final long serialVersionUID = 1L; | |
private Provider<Person> personProvider; | |
@Inject | |
BeanObjectFactory(Provider<Person> personProvider) { | |
this.personProvider = personProvider; | |
} | |
@Override | |
public Object create(@SuppressWarnings("rawtypes") Class type) { | |
if(Person.class == type){ | |
return this.personProvider.get(); | |
} | |
return super.create(type); | |
} | |
} |