Spring中如何整合Mybatis


Spring中如何整合Mybatis,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Spring整合Mybtais会进行如下的配置短短不到20行代码,就完成了Spring整合Mybatis。Amazing!!! 这背后到底发生了什么?还要从MapperScannerConfigurer 和SqlSessionFactoryBean 着手。beanDefinitionRegistryPostProcessor从 base package递归搜索接口,将它们注册为MapperFactoryBean。注意接口必须包含至少一个方法,其实现类将被忽略。1.0.1以前是对BeanFactoryPostProcessor进行扩展,1.0.2以后是对 BeanDefinitionRegistryPostProcessor进行扩展,具体原因请查阅https://jira.springsource.org/browse/SPR-8269basePackage可以配置多个,使用逗号或者分号分割。通过annotationClass或markerInterface,可以设置指定扫描的接口。默认情况下这个2个属性为空,basePackage下的所有接口将被扫描。MapperScannerConfigurer为它创建的bean自动注入SqlSessionFactory或SqlSessionTemplate如果存在多个SqlSessionFactory,需要设置sqlSessionFactoryBeanName或sqlSessionTemplateBeanName来指定具体注入的sqlSessionFactory或sqlSessionTemplate。不能传入有占位符的对象(例如: 包含数据库的用户名和密码占位符的对象)。可以使用beanName,将实际的对象创建推迟到所有占位符替换完成后。注意MapperScannerConfigurer支持它自己的属性使用占位符,使用${property}这个种格式。从类图上看MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware接口。各个接口具体含义如下:ApplicationContextAware:当spring容器初始化后,会自动注入ApplicationContextBeanNameAware :设置当前Bean在Spring中的名字InitializingBean接口只包括afterPropertiesSet方法,在初始化bean的时候会执行BeanDefinitionRegistryPostProcessor: 对BeanFactoryPostProcessor的扩展,允许在BeanFactoryPostProcessor执行前注册多个bean的定义。需要扩展的方法为postProcessBeanDefinitionRegistry。查询,MapperScannerConfigurer的afterPropertiesSet方法如下,无具体扩展信息。结合MapperScannerConfigurer的注释与类图分析,确定其核心方法为:postProcessBeanDefinitionRegistry从源码中看到除了processPropertyPlaceHolders外,其他工作都委托了ClassPathMapperScanner之前说BeanDefinitionRegistryPostProcessor在BeanFactoryPostProcessor执行前调用,这就意味着Spring处理占位符的类PropertyResourceConfigurer还没有执行!那MapperScannerConfigurer是如何支撑自己的属性使用占位符的呢?这一切的答案都在processPropertyPlaceHolders这个方法中。看完processPropertyPlaceHolders,可以总结 MapperScannerConfigurer支持它自己的属性使用占位符的方式找到所有已经注册的PropertyResourceConfigurer类型的Bean使用new DefaultListableBeanFactory()来模拟Spring环境,将MapperScannerConfigurer注册到这个BeanFactory中,执行BeanFactory的后处理,来替换占位符。MapperScannerConfigurer的类注释中有一条:通过annotationClass或markerInterface,可以设置指定扫描的接口,默认情况下这个2个属性为空,basePackage下的所有接口将被扫描。 scanner.registerFilters(),就是对annotationClass和markerInterface的设 香港云主机置。虽然设置了过滤器,如何在扫描中起作用就要看scanner.scan方法了。doScan方法如下:位于ClassPathMapperScanner的父类ClassPathBeanDefinitionScanner的doScan方法,就是扫描包下的所有java文件转换为BeanDefinition(实际是ScannedGenericBeanDefinition)。processBeanDefinitions就是将之前的BeanDefinition转换为MapperFactoryBean的BeanDefinition。至于过滤器如何生效(即annotationClass或markerInterface)呢?我一路追踪源码终于在ClassPathScanningCandidateComponentProvider的isCandidateComponent找到了对过滤器的处理MapperScannerConfigurer实现了beanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法从指定的 basePackage的目录递归搜索接口,将它们注册为MapperFactoryBean创建Mybatis的SqiSessionFactory,用于Spring上下文中进行共享。SqiSessionFactory可以通过依赖注入到与mybatis的daos中。datasourcetransactionmanager,jtatransactionmanager与sqlsessionfactory想结合实现事务。SqlSessionFactoryBean实现了ApplicationListener ,InitializingBean,FactoryBean接口,各个接口的说明如下:ApplicationListener 用于监听Spring的事件InitializingBean接口只包括afterPropertiesSet方法,在初始化bean的时候会执行FactoryBean:返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象应该重点关注afterPropertiesSet和getObject的方法。afterPropertiesSet方法buildSqlSessionFactory看方法名称就知道在这里进行了SqlSessionFactory的创建,具体源码不在赘述。getObject方法实现了InitializingBean的afterPropertiesSet,在其中创建了Mybatis的SqlSessionFactory实现了FactoryBean的getObject 返回创建好的sqlSessionFactory。看完这SqlSessionFactoryBean和MapperScannerConfigurer之后,不知道你是否有疑问!一般在Spring中使用Mybatis的方式如下:SqlSessionFactoryBean创建了Mybatis的SqlSessionFactory。MapperScannerConfigurer将接口转换为了MapperFactoryBean。那又哪里调用的sqlSession.getMapper(UsrMapper.class)呢???MapperFactoryBean是这一切的答案(MapperFactoryBean:注意看我的名字—Mapper的工厂!!)能够注入MyBatis映射接口的BeanFactory。它可以设置SqlSessionFactory或预配置的SqlSessionTemplate。
注意这个工厂仅仅注入接口不注入实现类看类图,又看到了InitializingBean和FactoryBean!!!InitializingBean接口只包括afterPropertiesSet方法,在初始化bean的时候会执行FactoryBean:返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象再次重点关注afterPropertiesSet和getObject的实现!DaoSupport类中有afterPropertiesSet的实现如下:initDao是个空实现,checkDaoConfig在MapperFactoryBean中有实现如下:关键的语句是configuration.addMapper(this.mapperInterface),将接口添加到Mybatis的配置中。getObject方法超级简单,就是调用了sqlSession.getMapper(UsrMapper.class);实现了InitializingBean的afterPropertiesSet方法,在其中将mapper接口设置到mybatis的配置中。实现了FactoryBean的getObject 方法,调用了sqlSession.getMapper,返回mapper对象。Spring整合Mybatis核心3类:MapperScannerConfigurer实现了beanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,在其中从指定的 basePackage的目录递归搜索接口,将它们注册为MapperFactoryBean类型的BeanDefinitionSqlSessionFactoryBean实现了InitializingBean的afterPropertiesSet,在其中创建了Mybatis的SqlSessionFactory。实现了FactoryBean的getObject 返回创建好的sqlSessionFactory。MapperFactoryBean实现了InitializingBean的afterPropertiesSet方法,将mapper接口设置到mybatis的配置中。实现了FactoryBean的getObject 方法,调用了sqlSession.getMapper,返回mapper对象。关于Spring中如何整合Mybatis问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注开发云行业资讯频道了解更多相关知识。

相关推荐: Sqoop基本语法简介

简介:本篇文章主要介绍sqoop的基本语法及简单使用方法。(默认导入当前用户目录下/user/用户名/表名)说到这里扩展一个小知识点:这时很可能会出现这个错误Exception in thread “main” java.lang.NoClassDefFoun…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/26 10:25
下一篇 07/26 10:26

相关推荐