自动扫描 将Mapper接口生成代理注入到Spring
1 <!-- DAO接口所在包名,Spring会自动查找其下的类 --> 2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 3 <property name="basePackage" value="com.em" /> 4 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 5 </bean>
-
MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中
-
把Mapper接口转换成MapperFactoryBean
- 其实在SqlSessionFactoryBean 里面就已经实现了注册了 MapperProxyFactory 到Mybatis
- 这里做的是把它们托管到spring
{ if (this.processPropertyPlaceHolders) { processPropertyPlaceHolders(); }
1ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry); 2scanner.setAddToConfig(this.addToConfig); 3scanner.setAnnotationClass(this.annotationClass); 4scanner.setMarkerInterface(this.markerInterface); 5scanner.setSqlSessionFactory(this.sqlSessionFactory); 6scanner.setSqlSessionTemplate(this.sqlSessionTemplate); 7scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName); 8scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName); 9scanner.setResourceLoader(this.applicationContext); 10scanner.setBeanNameGenerator(this.nameGenerator); 11scanner.registerFilters(); 12scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));}
-
注意,不管先后顺序
-
SqlSessionFactoryBean 继承了InitializingBean 接口
- 会在所有spring 注册完成后,执行afterPropertiesSet方法
-
1 public void afterPropertiesSet() throws Exception { 2 Assert.notNull(this.dataSource, "Property 'dataSource' is required"); 3 Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); 4 this.sqlSessionFactory = this.buildSqlSessionFactory(); 5 }
-