spring是怎样管理mybatis的及注入mybatis mapper bean的

1.spring启动mybatis的两个重要类:SqlSessionFactoryBean和MapperFactoryBean,这两个类都是org.mybatis.spring jar包的。

是用来启动mybatis的关键,spring为什么能识别这两个类?因为这两个类实现了spring的接口。

这里面的重点就是 org.mybatis.spring.SqlSessionFactoryBean 与 org.mybatis.spring.mapper.MapperFactoryBean[b] 实现了 spring  的接口,并产生对象。

org.mybatis.spring.SqlSessionFactoryBean

org.mybatis.spring.mapper.MapperFactoryBean

2.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<!--dataSource属性指定要用到的连接池-->

<property name="dataSource" ref="dataSource"/>

<!--configLocation属性指定mybatis的核心配置文件-->

<property name="configLocation" value="config/Configuration.xml"/>

</bean>

3.

myabtis的mapper bean实现类叫org.mybatis.spring.mapper.MapperFactoryBean

所在jar包为org.mybatis.spring包

说白了就是mybatis的java实现类是MapperFactoryBean,所在jar包层次org.mybatis.spring.mapper.MapperFactoryBean

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

<!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->

<property name="sqlSessionFactory" ref="sqlSessionFactory" />

<!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->      <property name="mapperInterface" value="com.yihaomen.mybatis.inter.IUserOperation" />

</bean>

4.mybatis的启动,第一步就是产生sqlsessionFactory

在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池)

3.

从上图中可以看出,SqlSessionFactoryBuilder类负责构建SqlSessionFactory,并且提供了多个build的重载方法。但其实很多都是在调同一签名的方法,例如:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) ,只是由于方法参数environment和 propertiese都可以为null,

所以为了提供调用的便利性,才提供了下面的三个方法:

  

public SqlSessionFactory build(InputStream inputStream)
public SqlSessionFactory build(InputStream inputStream, String environment)
public SqlSessionFactory build(InputStream inputStream, Properties properties)

按照上述思路去除重复的,真正的重载方法只有如下三种:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
public SqlSessionFactory build(Reader reader, String environment, Properties properties)
public SqlSessionFactory build(Configuration config)

可以看出,配置信息可以以三种形式提供给SqlSessionFactory的build方法,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个SqlSessionFactory有两种方式,大致代码如下:

(1) 读取xml文件构造方式

String resource = "org/mybatis/example/mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream) ;

(1) 读取xml文件构造方式

String resource = "org/mybatis/example/mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream) ;

(2) 编程构造方式

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration) ;

下面先来分析XML文件构造方式的build方法的源码:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

通过上面这几行代码,就能看出基于XML文件的这种构造方式,通过从XML中读取信息的工作之后,也是构造出Configuration对象之后再继续进行SqlSessionFactory的构建工作的,只是多了些XML的解析工作,所以我们只需单刀直入,直按分析编程构造方式的代码就可以了,或者是直接分析 build(parser.parse())这句代码(参数产生过程先跳过)

编程构造方式的build方法源码如下(基于xml的构造方式的build(parser.parse())最终也是调了这个代码):

  

  public SqlSessionFactory build(Configuration config) {
                return new DefaultSqlSessionFactory(config);
    }

其实这么看来SqlSessionFactory在mybatis的默认实现类为org.apache.ibatis.session.defaults.DefaultSqlSessionFactory , 其构造过程主要是注入了Configuration的实例对象,Configuration的实例对象即可通过解析xml配置文件产生,也可能通过代码直接构造。以上代码使用了一个设计模式:建设者模式(Builder),SqlSessionFactoryBuilder扮演具体的建造者,Configuration类则负责建造的细节工作,SqlSession则是建造出来的产品。

以下是类图和建造者模式的基本形态图,读者自行对照阅读。

    

构造者模式是一种对象的创建模式。它可以将一个复杂对象的内部构成特征与对象的构建过程完全分开。

时间: 2024-10-18 11:33:05

spring是怎样管理mybatis的及注入mybatis mapper bean的的相关文章

Spring系列【3】应用构造器注入法实现Bean的注入

package cn.com.xf; public class User { private String name; private int age; private String remark; //省略setter/getter方法 @Override public String toString() { return "User [name=" + name + ", age=" + age + ", remark=" + remark

Spring系列【2】应用setter注入法实现Bean的注入

package cn.com.xf; public class User { private String name; private int age; private String remark; //省略属性的getter/setter方法 @Override public String toString() { return "User [name=" + name + ", age=" + age + ", remark=" + rema

初识Spring框架实现IOC和DI(依赖注入)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转

mybatis集成spring的事务管理

第一 创建一个测试实体 1 public class Order { 2 3 private int id; 4 private String orderName; 5 6 public Order(String orderName) { 7 this.orderName = orderName; 8 } 9 10 public int getId() { 11 return id; 12 } 13 public void setId(int id) { 14 this.id = id; 15

Mybatis整合Spring实现事务管理的源码分析

一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是看的过程中灵感的显现很重要(就是直觉知道接下来的步骤是什么应该是什么之类的,但是这个自觉是猜的而非蒙的,即过程里是有往会递推看到了一些关键点的而不是抛色子来确定是哪个子类) ,因此自己写的时候也无法将看的过程里产生的想法写得很细,过程也有点跳,如果大家有疑问最好自己去验证(方式就是搜索然后看哪里调用

spring整合mybatis接口无法注入问题

在学习Spring完之后简单的了解了MyBatis.然后进行简单的整合,遇到MyBatista接口映射的Bean无法自动注入的问题: 代码异常: 线程“main”org.springframe .bean .factory中的异常.创建名为“UserController”的bean时出错:通过字段“userdao”表示的不满足的依赖关系;嵌套异常是org.springframe .bean .factory.BeanCreationException:在文件[C:\Users\li rui lo

深入Spring:自定义事务管理

转自: http://www.jianshu.com/p/5347a462b3a5 前言 上一篇文章讲了Spring的Aop,这里讲一下Spring的事务管理,Spring的事务管理是建立在Aop的基础上的,相比Aop,事务管理的实现耦合性比较小,自定义就比较简单了. 自定义事务 Spring的开启事务管理主要是通过@EnableTransactionManagement注解来实现的.查看源码就会发现,这个注解主要是注入了两个类InfrastructureAdvisorAutoProxyCrea

spring 配置事务管理器

在Spring中数据库事务是通过PlatformTransactionManager进行管理的,jdbcTemplate是不能支持事务的,而能够支持事务的是org.springframework.transaction.support.TransactionTemplate模板,它是Spring所提供的事务管理器的模板 •事务的创建.提交和回滚是通过PlatformTransactionManager接口来完成的. •当事务产生异常时会回滚事务,在默认的实现中所有的异常都会回滚.我们可以通过配置

详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)

使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO 类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean