一,执行流程
总结
- 核心依赖于动态代理模式创建Mapper接口代理实例
- SqlSessionFactory负责创建SqlSession,全局唯一实例(类似于单例)
- Configuration 核心中的核心,走到哪里都有它的存在,而且是全局唯一实例(类似于单例)
二,注入容器流程
1:MapperScan 扫描Mapper接口,注册到Spring容器
向Spring注册MapperScannerConfigurer,它实现了BeanDefinitionRegistryPostProcessor
将扫描到所有的Mapper接口(BeanDefinition)定义信息的BeanClass设置为MapperFactoryBean
设置Bean定义信息(BeanDefinition)属性autowireMode为AUTOWIRE_BY_TYPE
2:从Spring容器创建Mapper接口的代理对象实例
MapperFactoryBean实现了FactoryBean,所以调用getObject()获取对象实例。
通过SqlSessionTemplate.getMapper,再经过Configuration.getMapper,创建一个Mapper接口的代理对象
3:Mapper接口SQL执行
SqlSessionTemplate.CRUD CRUD 是SQL操作方法,它实现了SqlSession接口。
SqlSessionTemplate.sqlSessionProxy.CRUD, sqlSessionProxy = SqlSessionTemplate.SqlSessionInterceptorJDK代理回调。
SqlSessionTemplate.SqlSessionInterceptor.invoke(),
先从Spring事务管理器中获取是否有SqlSession,如果没有,则在 当前Spring事务中,获去SQL连接,在用这个SQL连接获取SqlSession。
执行完目标方法,如果应用的Spring事务管理,则Spring事务会自动提交,如果没有应用,则mybatis-spring会自动提交事务。
4,总结
mybatis-spring,每次执行Sql都会是一个新的SqlSession会话连接,所以不要去关心SqlSession的一级缓存线程安全问题。
它自定义了一个Spring事务管理器,可以非常方便的应用Spring事务。
就算没有去应用Spring事务,mybatis-spring也会自动提交事务,所以开发过程,不用去操心事务没有提交的问题。
mybatis-spring开发如果我们想要手动去开启,提交,回滚事务,就必选要应用到Spring事务管理器。
mybatis-spring创建的每一个Mapper接口的Bean实例,都是线程安全的。
三,源码结构
初始化,解析配置文件相关类
src/main/java/org/apache/ibatis/session/Configuration:核心中核心配置类,无论执行什么操作,都有他的存在。
src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder:解析mybatis-config.xml。
src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder:解析mapper.xml。
src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder:解析mapper.xml中的Sql语句。
src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder:解析Mapper接口的注解信息。
src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant:解析mapper.xml的辅助工具类。
src/main/java/org/apache/ibatis/mapping/MappedStatement:描述<select|update|insert|delete>或者@Select、@Update等注解配置的SQL信息。
src/main/java/org/apache/ibatis/binding/MapperRegistry:mapper注册器,用于将所有的mapper接口添加到内存中(缓存)。
会话,创建相关类
src/main/java/org/apache/ibatis/session/SqlSessionFactoryBuilder:用于创建SqlSessionFactory。
src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSessionFactory:默认的Sql会话工厂,用于获取SqlSession。
src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession:默认的Sql会话。
src/main/java/org/apache/ibatis/binding/MapperProxyFactory:创建Mapper接口代理的工厂类。
src/main/java/org/apache/ibatis/binding/MapperProxy:Mapper代理的回调,(InvocationHandler)
执行Sql相关的类
src/main/java/org/apache/ibatis/binding/MapperMethod:执行SQL的描述信息,执行操作。
src/main/java/org/apache/ibatis/mapping/BoundSql:、在执行一次CRUD操作过程中产生的中间数据的集中点。
src/main/java/org/apache/ibatis/cache/Cache:缓存接口,自定义二级缓存实现此接口。
src/main/java/org/apache/ibatis/executor/BaseExecutor:基础的执行器,所有的执行器都继承自它。
src/main/java/org/apache/ibatis/executor/CachingExecutor:开启的二级缓存的执行器;(默认是开启的)。
src/main/java/org/apache/ibatis/executor/SimpleExecutor:简单的执行器,也是默认的执行器。
src/main/java/org/apache/ibatis/executor/statement/StatementHandler:负责处理Mybatis与JDBC之间Statement的交互(是一个接口)
src/main/java/org/apache/ibatis/executor/statement/RoutingStatementHandler:类型于路由器,用于选择SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler。(这些类都实现了StatementHandler接口)
src/main/java/org/apache/ibatis/executor/statement/PreparedStatementHandler:与PreparedStatement交互作用。
PreparedStatement:预编译Sql执行。
src/main/java/org/apache/ibatis/executor/resultset/ResultSetHandler:将结果集resultSets转化成Java对象,(是一个接口)。
src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler:默认的结果集处理器,实现ResultSetHandler接口。
事务相关的类
src/main/java/org/apache/ibatis/session/TransactionIsolationLevel:事务隔离级别。(枚举类)。
src/main/java/org/apache/ibatis/transaction/Transaction:定义事务抽象方法的接口。
src/main/java/org/apache/ibatis/transaction/TransactionFactory:事务创建工厂,(是一个接口)
src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransactionFactory:创建JdbcTransaction工厂类。
src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransaction:JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交。