您的位置:首页 > 编程语言 > Java开发

Mybatis结合Spring注解自动扫描源码分析

2015-08-03 07:06 686 查看
作为一个想做架构师的程序员,必须是一个优秀的程序员,在引入某一个框架的时候,必须要研究源码,将新的开源框架的风险变为可控性。

1.Spring结合Mybatis最常用的配置。
[align=left]<!--理论加实践,才是架构师嘚最佳实践 -->[/align]
<!--JDBC
Data Source -->
[align=left] <bean id= "testdataSource"[/align]
[align=left] class= "org.springframework.jdbc.datasource.DriverManagerDataSource" >[/align]
[align=left] <property name= "driverClassName" value="oracle.jdbc.driver.OracleDriver" />[/align]
<!--
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
[align=left] /> -->[/align]
[align=left] <property name= "url" value="jdbc:oracle:thin:@192.168.137.101:1521:ora92" />[/align]
[align=left] <property name= "username" value ="sale" />[/align]
[align=left] <property name= "password" value ="sale" />[/align]
[align=left] </bean>[/align]

[align=left] <bean id= "sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >[/align]
[align=left] <property name= "dataSource" ref ="testdataSource" />[/align]
[align=left] <property name= "mapperLocations">[/align]
[align=left] <list>[/align]
[align=left] <value> classpath:com/etrading /mapping/**/*Mapper.xml</ value>[/align]
[align=left] </list>[/align]
[align=left] </property>[/align]
<!--
<property name="typeAliasesPackage" value="com.nicchagil.mybatis3spring3intg.bean"
[align=left] /> -->[/align]
[align=left] </bean>[/align]

[align=left] <bean class= "org.mybatis.spring.mapper.MapperScannerConfigurer" >[/align]
[align=left] <property name= "basePackage"[/align]
[align=left] value= "com/etrading/mapping/common;com/etrading/mapping/account" />[/align]
[align=left] <property name= "sqlSessionFactoryBeanName" value="sqlSessionFactory" />[/align]
[align=left] </bean>[/align]
[align=left]1)Spring为了整合Mybatis,专门封装了一个jar包(mybatis-spring-1.2.3.jar),其中MapperScannerConfigurer封装了自动扫描全局路径下的Mapper[/align]
[align=left]2)MapperScannerConfigurer源码分析(基于mybatis-spring-1.2.3.jar)[/align]
[align=left] 其实要弄通源码,一定要弄通spring容器源码,这个是基础(理解框架设计的思想,其实很多代码思想是可以复用的)[/align]
[align=left] 简单的梳理下Spring容器思想:[/align]
[align=left] Spring容器环境起来-->通过refresh()方法刷新容器(比较简洁)[/align]
[align=left] MapperScannerConfigurer就是在刷新容器的过程中自动的执行方法postProcessBeanDefinitionRegistry[/align]
[align=left] /**[/align]
[align=left] * {@inheritDoc}[/align]
[align=left] * 通过Spring容器触发postProcessBeanDefinitionRegistry[/align]
[align=left] * @since 1.0.2[/align]
[align=left] */[/align]
[align=left] @Override[/align]
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry
registry) {
if ( this. processPropertyPlaceHolders )
{
[align=left] processPropertyPlaceHolders();[/align]
[align=left] }[/align]

[align=left] //核心处理类ClassPathMapperScanner,通过反射机制加载注解bean到spring容器[/align]
[align=left] ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);[/align]
[align=left] scanner.setAddToConfig( this .addToConfig );[/align]
[align=left] scanner.setAnnotationClass( this .annotationClass );[/align]
[align=left] scanner.setMarkerInterface( this .markerInterface );[/align]
[align=left] scanner.setSqlSessionFactory( this .sqlSessionFactory );//不需要在xml中设置sqlSessionFactory以及sqlSessionTemplate[/align]
[align=left] scanner.setSqlSessionTemplate( this .sqlSessionTemplate );[/align]
[align=left] scanner.setSqlSessionFactoryBeanName( this .sqlSessionFactoryBeanName );[/align]
[align=left] scanner.setSqlSessionTemplateBeanName( this .sqlSessionTemplateBeanName );[/align]
[align=left] scanner.setResourceLoader( this .applicationContext );[/align]
[align=left] scanner.setBeanNameGenerator( this .nameGenerator );[/align]
[align=left] scanner.registerFilters();[/align]
[align=left] //真正自动化扫描的类[/align]
scanner.scan(StringUtils. tokenizeToStringArray( this. basePackage,
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS ));
[align=left] }[/align]

孜孜不倦、厚积薄发。
----胡弦语录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: