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