Mybatis-Spring-インジェクションマッパ
12035 ワード
インジェクションマッパ
SqlSessionDaoSupportまたはSqlSessionTemplateを手動で使用してデータ・アクセス・オブジェクト(DAO)のコードを記述する代わりに、MyBatis-Springは動的エージェントの実装を提供します:MapperFactoryBean.このクラスは、サービス層beanにデータマッパインタフェースを直接注入することができます.マッパーを使用する場合は、DAOを呼び出すように呼び出すだけでいいですが、MyBatis-Springがエージェントを作成するので、DAO実装のコードを書く必要はありません.
注入されたマッパーコードを使用すると、MyBatis、Spring、またはMyBatis-Springに直接依存しません.MapperFactoryBeanが作成したエージェントは、セッションのオープンとクローズを制御し、SpringのDataAccessException例外に任意の例外を翻訳します.また、既存のアクティブなトランザクションに参加する必要がある場合、エージェントは新しいSpringトランザクションを開きます.
MapperFactoryBean
データ・マッパ・インタフェースは、Springに次のように追加できます.
MapperFactoryBeanが作成したプロキシクラスは、UserMapperインタフェースを実装し、アプリケーションに注入します.エージェントがランタイム環境(Runtime,訳者注)で作成されるため、指定したマッパーは特定のインプリメンテーションクラスではなくインタフェースでなければなりません.
UserMapperに対応するMyBatisのXMLマッパーファイルがある場合、XMLファイルがクラスパスの位置とマッパークラスと同じである場合、MapperFactoryBeanによって自動的に解析されます.マッパーのXMLファイルが異なるクラスパスの下にない限り、MyBatisプロファイルでマッパーを指定する必要はありません.詳細については、SqlSessionFactoryBeanのconfigLocationプロパティ(第3章)を参照してください.
なお、MapperFactoryBeanがSqlSessionFactoryまたはSqlSessionTemplateを必要とする場合.これらは、それぞれのSqlSessionFactoryまたはSqlSessionTemplateプロパティで設定するか、Springで自動的にアセンブリできます.両方のプロパティが設定されている場合、SqlSessionFactoryは無視されます.SqlSessionTemplateにはsession工場の設定が必要です.その工場はMapperFactoryBeanによって作られます.を使用します.
ビジネス/serviceオブジェクトに直接Spring beanを注入するのと同じ方法でマッパーを直接注入できます.
このbeanは、アプリケーションロジックで直接使用できます.
このコードにはSqlSessionまたはMyBatisの参照はありません.セッションのコードを作成、開く、閉じる必要はありません.MyBatis-Springはそれに関心を持っています.
MapperScannerConfigurer
SpringのXMLプロファイルにすべてのマッパーを登録する必要はありません.逆に、クラスパスの下にあるマッパーを検索し、自動的にマッパーファクトリBeanとして作成するMapperScannerConfigurerを使用できます.
MapperScannerConfigurerを作成するには、Springの構成に次のコードを追加します.
basePackageプロパティは、マッパーインタフェースファイルに基本的なパッケージパスを設定することです.区切り記号としてセミコロンまたはカンマを使用して、複数のパケットパスを設定できます.各マッパは、指定したパケットパスで再帰的に検索されます.
MapperScannerConfigurerプロパティでは、Springの前にロードされるため、PropertyPlaceholderConfigurerを使用したプロパティの置き換えはサポートされていません.しかし、代替としてPropertiesFactoryBeanとSpEL式を使用することができます.
MapperScannerConfigurerはMapperFactoryBeanを作成し、自動的にアセンブリするので、SqlSessionFactoryまたはSqlSessionTemplateを指定する必要はありません.ただし、1つ以上のデータソースを使用すると、自動アセンブリが無効になる可能性があります.この場合、sqlSessionFactoryBeanNameまたはsqlSessionTemplateBeanNameプロパティを使用して、正しいbean名を設定して使用できます.これがどのように構成されているのか、beanの参照ではなくbeanの名前が必要であることに注意してください.そのため、value属性はここで通常のrefに代わります.
MapperScannerConfigurerは、指定した作成インタフェースまたは注釈によるマッパーのフィルタリングをサポートします.annotationClassプロパティは、検索する注釈の名前を指定します.markerInterfaceプロパティは、検索する親インタフェースを指定します.両方が指定されている場合、インタフェースに追加されたマッパーは2つの基準に一致します.デフォルトでは、両方のプロパティはnullなので、ベースパッケージで指定されたすべてのインタフェースをマッパとしてロードできます.
発見されたマッパーは、Springの自動検出コンポーネント(Springマニュアルの3.14.4を参照)のデフォルトのネーミングポリシーを使用してネーミングされます.すなわち、注釈が見つからない場合、マッピングの非大文字の非完全限定クラス名が使用されます.ただし、@ComponentまたはJSR-330の@Name注記が見つかった場合は、名前が取得されます.orgに設定できることに注意してください.springframework.stereotype.Component , javax.inject.Named(JSE 6を使用する場合)または独自の注釈(自己注釈に違いない)では、注釈がジェネレータと名前プロバイダとして使用されます.
SqlSessionDaoSupportまたはSqlSessionTemplateを手動で使用してデータ・アクセス・オブジェクト(DAO)のコードを記述する代わりに、MyBatis-Springは動的エージェントの実装を提供します:MapperFactoryBean.このクラスは、サービス層beanにデータマッパインタフェースを直接注入することができます.マッパーを使用する場合は、DAOを呼び出すように呼び出すだけでいいですが、MyBatis-Springがエージェントを作成するので、DAO実装のコードを書く必要はありません.
注入されたマッパーコードを使用すると、MyBatis、Spring、またはMyBatis-Springに直接依存しません.MapperFactoryBeanが作成したエージェントは、セッションのオープンとクローズを制御し、SpringのDataAccessException例外に任意の例外を翻訳します.また、既存のアクティブなトランザクションに参加する必要がある場合、エージェントは新しいSpringトランザクションを開きます.
MapperFactoryBean
データ・マッパ・インタフェースは、Springに次のように追加できます.
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
MapperFactoryBeanが作成したプロキシクラスは、UserMapperインタフェースを実装し、アプリケーションに注入します.エージェントがランタイム環境(Runtime,訳者注)で作成されるため、指定したマッパーは特定のインプリメンテーションクラスではなくインタフェースでなければなりません.
UserMapperに対応するMyBatisのXMLマッパーファイルがある場合、XMLファイルがクラスパスの位置とマッパークラスと同じである場合、MapperFactoryBeanによって自動的に解析されます.マッパーのXMLファイルが異なるクラスパスの下にない限り、MyBatisプロファイルでマッパーを指定する必要はありません.詳細については、SqlSessionFactoryBeanのconfigLocationプロパティ(第3章)を参照してください.
なお、MapperFactoryBeanがSqlSessionFactoryまたはSqlSessionTemplateを必要とする場合.これらは、それぞれのSqlSessionFactoryまたはSqlSessionTemplateプロパティで設定するか、Springで自動的にアセンブリできます.両方のプロパティが設定されている場合、SqlSessionFactoryは無視されます.SqlSessionTemplateにはsession工場の設定が必要です.その工場はMapperFactoryBeanによって作られます.を使用します.
ビジネス/serviceオブジェクトに直接Spring beanを注入するのと同じ方法でマッパーを直接注入できます.
<bean id="fooService" class="org.mybatis.spring.sample.mapper.FooServiceImpl">
<property name="userMapper" ref="userMapper" />
</bean>
このbeanは、アプリケーションロジックで直接使用できます.
public class FooServiceImpl implements FooService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User doSomeBusinessStuff(String userId) {
return this.userMapper.getUser(userId);
}
}
このコードにはSqlSessionまたはMyBatisの参照はありません.セッションのコードを作成、開く、閉じる必要はありません.MyBatis-Springはそれに関心を持っています.
MapperScannerConfigurer
SpringのXMLプロファイルにすべてのマッパーを登録する必要はありません.逆に、クラスパスの下にあるマッパーを検索し、自動的にマッパーファクトリBeanとして作成するMapperScannerConfigurerを使用できます.
MapperScannerConfigurerを作成するには、Springの構成に次のコードを追加します.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
basePackageプロパティは、マッパーインタフェースファイルに基本的なパッケージパスを設定することです.区切り記号としてセミコロンまたはカンマを使用して、複数のパケットパスを設定できます.各マッパは、指定したパケットパスで再帰的に検索されます.
MapperScannerConfigurerプロパティでは、Springの前にロードされるため、PropertyPlaceholderConfigurerを使用したプロパティの置き換えはサポートされていません.しかし、代替としてPropertiesFactoryBeanとSpEL式を使用することができます.
MapperScannerConfigurerはMapperFactoryBeanを作成し、自動的にアセンブリするので、SqlSessionFactoryまたはSqlSessionTemplateを指定する必要はありません.ただし、1つ以上のデータソースを使用すると、自動アセンブリが無効になる可能性があります.この場合、sqlSessionFactoryBeanNameまたはsqlSessionTemplateBeanNameプロパティを使用して、正しいbean名を設定して使用できます.これがどのように構成されているのか、beanの参照ではなくbeanの名前が必要であることに注意してください.そのため、value属性はここで通常のrefに代わります.
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
MapperScannerConfigurerは、指定した作成インタフェースまたは注釈によるマッパーのフィルタリングをサポートします.annotationClassプロパティは、検索する注釈の名前を指定します.markerInterfaceプロパティは、検索する親インタフェースを指定します.両方が指定されている場合、インタフェースに追加されたマッパーは2つの基準に一致します.デフォルトでは、両方のプロパティはnullなので、ベースパッケージで指定されたすべてのインタフェースをマッパとしてロードできます.
発見されたマッパーは、Springの自動検出コンポーネント(Springマニュアルの3.14.4を参照)のデフォルトのネーミングポリシーを使用してネーミングされます.すなわち、注釈が見つからない場合、マッピングの非大文字の非完全限定クラス名が使用されます.ただし、@ComponentまたはJSR-330の@Name注記が見つかった場合は、名前が取得されます.orgに設定できることに注意してください.springframework.stereotype.Component , javax.inject.Named(JSE 6を使用する場合)または独自の注釈(自己注釈に違いない)では、注釈がジェネレータと名前プロバイダとして使用されます.