在Mybatis 与 Spring 进行整合的时候,我们会进行sqlSessionFactory 的配置,来创建sqlSessionFactory 对象:如下;
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation"><value>classpath:mybatis/mybatis-config.xml</value></property> <!-- 自动扫描mapper.xml文件 --> <property name="mapperLocations" value="classpath:mybatis/mapper/**/*.xml"></property>
<property name="dataSource" ref="mysqlDs" />
</bean>
我们点进去 SqlSessionFactoryBean 内部
类继承关系:果然这三个集成接口全部都是Spring 的扩展接口; public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent>
根据XML的配置,我们可以看到(知识点:对于定义的 Resource属性,Spring 会自动将我们XML 配置的资源文件转换为Resource 对象,就可以对文件进行操作了,很方便 ) private Resource configLocation; private Resource[] mapperLocations; private DataSource dataSource;
因为 SqlSessionFactoryBean 实现了 InitializingBean的接口,我们先看 afterPropertiesSet() 方法:
public void afterPropertiesSet() throws Exception { notNull(dataSource, "Property 'dataSource' is required"); notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); //初始化sqlSessionFactory this.sqlSessionFactory = buildSqlSessionFactory(); }
可以看到 buildSqlSessionFactory() 方法进行了sqlSessionFactory 的初始化操作;
buildSqlSessionFactory()内容比较多,从全局出发大致就是这四件事情:
1. 在整个sqlSessionFactory 维护着一个Configuration 的配置信息,这个配置信息包括了数据库的配置,以及我们定义mybatis-config.xml 我们自定义的mapper.xml 解析后的配置信息,几乎是所有的mapper配置信息都可以在这个类中找到,是mybatis 开发中重要组件,没有此类,几乎所有的方法不能运行;
2. xmlConfigBuilder.parse(); 解析 mybatis-config.xml ,把一些我们在 mybatis-config.xml 定义的一些配置 plugins, typeAliases,mappers等很多配置的信息,存放到 Configuration 组件中;
3. xmlMapperBuilder.parse(); 这个是用来解析我们的自定义的mapper.xml 的方法,作用也一样,就是将配置sql ,namespace ,方法加载到 Configuration 组件中,会将sql片段进行保存(XML 解析的方式主要就是jaxp 的dom 解析以及xpath 解析);
4. return this.sqlSessionFactoryBuilder.build(configuration); 创建 sqlSessionFactory 对象,-> 返回
return new DefaultSqlSessionFactory(config); 默认的 DefaultSqlSessionFactory
可以看到很多的操作都是在维护 Configuration的配置信息;可想而知,很重要;
原创打造,多多指教