博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring源码学习之整合Mybatis原理分析
阅读量:5879 次
发布时间:2019-06-19

本文共 3319 字,大约阅读时间需要 11 分钟。

hot3.png

总结简述:

    • 在该xml 文档下配置如下
      • classpath:sqlmap/*/*.xml

创建MapperScannerConfigurer

public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware
  • MapperScannerConfigurer 实现了BeanDefinitionRegistryPostProcessor 接口
    • 初始化时,会自动调用 postProcessBeanDefinitionRegistry 方法
    • public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {    if (this.processPropertyPlaceHolders) {      processPropertyPlaceHolders();    }    ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);    scanner.setAddToConfig(this.addToConfig);    scanner.setAnnotationClass(this.annotationClass);    scanner.setMarkerInterface(this.markerInterface);    scanner.setSqlSessionFactory(this.sqlSessionFactory);    scanner.setSqlSessionTemplate(this.sqlSessionTemplate);    scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);    scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);    scanner.setResourceLoader(this.applicationContext);    scanner.setBeanNameGenerator(this.nameGenerator);    scanner.registerFilters();    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));  }

       

    • ClassPathMapperScanner这个扫描器的主要的作用有以下几个:
      • 第一扫描basePackage包下面所有的class类
      • 第二将所有的class类封装成为spring的ScannedGenericBeanDefinition sbd对象
      • 第三过滤sbd对象,只接受接口类,从下面的代码中可以看出
        • isCandidateComponent
      • 第四完成sbd对象属性的设置,
        • 比如设置sqlSessionFactory、BeanClass等,
        • 这个sqlSessionFactory是本文接下来要解析的SqlSessionFactoryBean
        • 注意scanner
          ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
        • 所以ClassPathMapperScanner 的doScan 要覆盖掉父类的
          • 执行processBeanDefinitions,内部设置很关键(说明这里封装的Mapper 接口,都是mapperFactoryBean)
            • definition.setBeanClass(this.mapperFactoryBean.getClass());
            • 后续使用 这些Mapper 接口的时候,其实获取实例调用的是
            • public T getObject() throws Exception {    return getSqlSession().getMapper(this.mapperInterface);  }

               

      • 第五将过滤出来的sbd对象通过这个BeanDefinitionRegistry registry
        • 注册器注册到DefaultListableBeanFactory中

d4ab30e3442444d7b1a517bfae4a4caef40.jpg

创建SqlSessionFactoryBean

继承了FactoryBean<SqlSessionFactory>

  • 注意 FactoryBean的方法

89109d3b2f6f85ea81b9885ef6965d427fb.jpg

  • 由于继承了InitializingBean 所以bean被创建的过程中
    • 执行afterPropertiesSet方法

      • buildSqlSessionFactory
        • } else if (this.configLocation != null) {      xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties);      configuration = xmlConfigBuilder.getConfiguration();    }
        • return this.sqlSessionFactoryBuilder.build(configuration);
          • return new DefaultSqlSessionFactory(config);

97d4be51907f0deb863c580ebc42d90503c.jpg

执行onApplicationEvent方法

  • 用完上面的afterPropertiesSet方法之后,
  • 第二个被调用的就是onApplicationEvent方法,
  • 这个方法的调用时机是,spring容器初始化完成之后

执行getObject方法

  • 第三个被调用的就是getObject方法,
  • 该方法是接口FactoryBean<SqlSessionFactory>中的方法。
  • 这个方法的调用时机是?
  • 首先需要简单介绍一下这个FactoryBean的作用
    • Spring通过反射机制利用<bean>标签的class属性指定实现类实例化Bean
      • 过于繁杂
    • Spring为此提供了一个org.springframework.beans.factory.FactoryBean<T>的工厂类接口,
      • 我们可以通过实现该接口定制实例化Bean的逻辑。
  • 实现了FactoryBean<T>接口的Bean,不同于普通Bean,
    • 根据该Bean的ID从BeanFactory中获取的
    • 实际上是FactoryBean的getObject()返回的对象,
    • 而不是FactoryBean本身,
      • 如果要获取FactoryBean对象,请在id前面加一个&符号来获取。

 

转载于:https://my.oschina.net/u/3847203/blog/3019774

你可能感兴趣的文章
关于跨DB增量(增、改)同步两张表的数据小技巧
查看>>
学员会诊之03:你那惨不忍睹的三层架构
查看>>
vue-04-组件
查看>>
Golang协程与通道整理
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
js - object.assign 以及浅、深拷贝
查看>>
python mysql Connect Pool mysql连接池 (201
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
Template Method Design Pattern in Java
查看>>