前提概要
上一篇關(guān)于SqlSessionFactoryBean的作用與源碼我已經(jīng)作了詳細(xì)的講解耻台,這里我們?cè)賹?duì)@MapperScan
進(jìn)行開(kāi)刀解析一番~~
使用方式
當(dāng)使用Java進(jìn)行配置Mybatis時(shí)可以使用@MapperScan
注解進(jìn)行對(duì)MyBatis的Mapper interfaces進(jìn)行注冊(cè)空免。
例子如下:
@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.addScript("schema.sql")
.build();
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory.getObject();
}
}
源碼講解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
@Repeatable(MapperScans.class)
public @interface MapperScan {
// 該屬性為#basePackages()的別名空另,可以使用更簡(jiǎn)便的方式描述如下:
// @MapperScan("org.my.pkg") 等價(jià)于
// @MapperScan(basePackages = "org.my.pkg")
String[] value() default {};
// MyBatis interfaces的包路徑名
// 注意:只有的至少有一個(gè)方法的接口類才會(huì)被注冊(cè)盆耽,具體的實(shí)現(xiàn)類將會(huì)被忽略
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends Annotation> annotationClass() default Annotation.class;
Class<?> markerInterface() default Class.class;
// 當(dāng)你有多個(gè)Datasource時(shí),需要指定使用哪一個(gè)SqlSessionTemplate
String sqlSessionTemplateRef() default "";
// 當(dāng)你有多個(gè)datasource時(shí)扼菠,需要指定使用哪一個(gè)SqlSessionFactory
String sqlSessionFactoryRef() default "";
// 指定一個(gè)自定義的MapperFactoryBean
Class<? extends MapperFactoryBean> factoryBean() default MapperFactoryBean.class;
}
注解在什么時(shí)候被引用摄杂?
這里我們看到MapperScan類頭上的注解@Import(MapperScannerRegistrar.class)
而@Import
這個(gè)注解是spring-context包中一個(gè)注解類,其功能如下:
package org.springframework.context.annotation;
/**
* 1. 指明要導(dǎo)入一個(gè)或多個(gè)@Configuration類循榆;
* 2. 提供等價(jià)于Spring XML中的<import/>元素的功能析恢。
* 允許導(dǎo)入@Configuration、ImportSelector和ImportBeanDefinitionRegistrar實(shí)現(xiàn)秧饮,
* 以及常規(guī)組件類映挂,類似于AnnotationConfigApplicationContext#register.
* 3. 導(dǎo)入的類中聲明的定義應(yīng)該可以通過(guò)使用@Autowired注入。
* 4. 可以在class級(jí)別或method中聲明盗尸;
* 5. 如果XML或其他非bean類定義資源需要導(dǎo)入柑船,可以使用@ImportResource注解實(shí)現(xiàn)
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
至此,我們的Mapper interfaces就會(huì)通過(guò)spring 的factory模式注冊(cè)泼各。所以我們定義的各個(gè)xxxMapper.java接口類就可以通過(guò)@Autowired注入使用鞍时。