MyBatisSpring SqlSessionFactoryBean


SqlSessionFactoryBean 配置
在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。

SqlSessionFactoryBean的定义

public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
 
}

能被Spring IoC容器管理的原因就是继承了FactoryBean这个接口了。

当实现了这个接口的 Bean 在配置为被 Spring 接管时,存入IoC容器中的实例类型将会是实例化泛型的那个类型,从IoC容器中获取时也是实例化泛型的那个类型,这种情况下,Spring 将会在应用启动时为你创建 SqlSessionFactory 对象,然后将它以 SqlSessionFactory 为名来存储。当把这个bean注入到Spring中去了以后,IoC容器中的其他类型就可以拿到 SqlSession 实例了,就可以进行相关的SQL执行任务了。

 

    /*
    定义MyBatis的核心连接工厂bean,
    等同于<bean class="org.mybatis.spring.SqlSessionFactoryBean">
     参数使用自动装配的形式加载dataSource,
    为set注入提供数据源,dataSource来源于JdbcConfig中的配置
     */
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(
            @Autowired DataSource dataSource,
            @Autowired PageInterceptor pageIntercptor){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        //等同于<property name="dataSource" ref="dataSource"/>
        ssfb.setDataSource(dataSource);
        Interceptor[] plugins={pageIntercptor};
        ssfb.setPlugins(plugins);
        return ssfb;
    }
    <!--sqlSessionFactoryBean创建--> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource-mysql" /> 
        <property name="typeAliasesPackage" value="com.du.wx.model" /> 
        <property name="mapperLocations" value="classpath:com/du/wx/resources/mapper/*.xml"/> 
    </bean> 

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
        <!-- joggle代表接口 --> 
        <property name="basePackage" value="com.du.wx.mapper.joggle" /> 
    </bean>

根据这个类的层次结构找出我们感兴趣的两个接口,FactoryBean 和 InitializingBean:

  • InitializingBean:实现此接口的 bean 会在初始化时调用其 afterPropertiesSet 方法来进行bean的逻辑初始化。
  • FactoryBean:一旦某个bean实现此接口,那么通过 getBean 方法获取 bean 时其实是获取此类的 getObject() 返回的实例

由于SqlSessionFactoryBean实现了FactoryBean接口,所以当通过 getBean 方法获取对应实例时,其实是获取该类的 getObject() 函数返回的实例,也就是获取初始化后的 sqlSessionFactory 属性

@Override
public SqlSessionFactory getObject() throws Exception {
    if (this.sqlSessionFactory == null) {
        afterPropertiesSet();
    }

    return this.sqlSessionFactory;
}
  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
  • Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
  • MyBatis-Spring 帮助你将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类, Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式来注入 MyBatis 数据映射器和 SqlSession 到业务层的 bean 中。 而且它也会处理事务, 翻译 MyBatis 的异常到 Spring 的 DataAccessException 异常中。最终,它并 不会依赖于 MyBatis,Spring 或 MyBatis-Spring 来构建应用程序代码。

REF

https://blog.csdn.net/yu_kang/article/details/88929606

https://blog.csdn.net/tales522/article/details/80993175

http://www.mybatis.cn/archives/859.html

https://www.cnblogs.com/question-sky/p/6602151.html

https://www.jianshu.com/p/adf2486ba56e

原文地址:https://www.cnblogs.com/emanlee/p/15737227.html