> 文档中心 > 【Spring】六、Spring与MyBatis整合核心源码分析

【Spring】六、Spring与MyBatis整合核心源码分析

上一篇:【Spring】五、Spring AOP分析

文章目录

  • Spring整合MyBatis涉及三个项目
  • Spring与MyBatis整合核心源码分析

Spring整合MyBatis涉及三个项目

  • Spring Framework: https://github.com/spring-projects/spring-framework
    Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures.?
    Spring提供了Java编程语言以外的所有所需内容,可用于为各种场景和体系结构创建企业应用程序;

  • MyBatis: https://github.com/mybatis/mybatis-3
    MyBatis SQL Mapper Framework for Java
    MyBatis SQL Mapper Java框架;

  • MyBatis-Spring: https://github.com/mybatis/spring
    MyBatis Spring Adapter

注意:Spring整合MyBatis,如何整合的问题不是Spring框架提供的,而是MyBatis框架自己提供的,MyBatis作者写了一个项目:mybatis-spring,用来整合spring,这是由于历史原因造成的

Spring容器两个核心步骤:
1、–> 根据配置(xml、注解)创建BeanDefinition(beanName、beanClass)
2、–> 根据BeanDefinition实例化具体的bean对象
注:如果中间有扩展点,会调用扩展点代码的实现;

Spring与MyBatis整合核心源码分析

  • 1、什么是BeanPostProcessor,什么是BeanFactoryPostProcessor?
    BeanPostProcessor在Spring容器初始化bean之前和初始化bean之后,干预bean的初始化行为;
    BeanFactoryPostProcessor是spring容器注册BeanDefinition时,用来干预BeanDefinition的行为;

  • 2、什么是FactoryBean,什么是BeanFactory?
    FactoryBean是工厂bean,获取对象时候或调getObject()方法返回对象;
    BeanFactory是spring容器;

  • 3、Mapper接口是怎么扫描出来的?
    通过MapperScannerConfigurer扫描mapper,该类是一个BeanFactoryPostProcessor,允许注册BeanDefinition;

  • 4、Mapper接口所对应的具体类是什么?

刚扫描的mapper包得到的beanDefinition里面的beanClass = GoodsMapper.class然后替换成了class org.mybatis.spring.mapper.MapperFactoryBean(偷天换日)OrderMapper.class 都会替换成 MapperFactoryBean.class
  • 5、@Mapper注解和@MapperScan注解有什么联系和区别?
@Mapper注解是一个标记注解,其实没什么用,要结合@MapperScan注解一起才有作用,比如:@MapperScan(value = "com.bjpowernode.mapper", annotationClass = Mapper.class)@Mapper注解标记的接口,可以被扫描出来,没有标记的接口就不能扫描出来,当然如果不指定annotationClass属性,则默认是扫描包下的所有接口;
  • 6、Mapper接口是怎么实例化的?
    采用MapperFactoryBean代表Mapper接口来创建一个对象;

  • 7、Service中注入的Mapper接口是什么对象?
    MapperFactoryBean实现了FactoryBean,当往service中注入Mapper时会从容器中会调用getObject()方法;

@Overridepublic T getObject() throws Exception {  return getSqlSession().getMapper(this.mapperInterface);}// jdk动态代理protected T newInstance(MapperProxy<T> mapperProxy) {  return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);}

Mapper接口–>MapperFactoryBean实现类–>getObject()方法–>mybatis底层的动态代理产生代理对象;