上文分析到调用
MybatisSqlSessionFactoryBean对象的getObject()方法,下面进行详细的分析该方法做的事情,首先判断该对象的成员属性SqlSessionFactory对象是否为空,很显然为空,则走到调用afterPropertiesSet方法进而调用buildSqlSessionFactory方法,该方法是getObject方法调用链的核心,下面给出部分代码截图:
可以看出该方法的中文注释,该方法主要就是创建一个SqlSessionFactory对象,判断configuration属性是否为空,该属性是MybatisConfiguration实例对象,它是Mybatis-Plus提供的类,继承自Mybatis包的Configuration对象,该类重写了原始Configuration对象一些方法,具体分析到调用该对象的方法时候再说,接着向下执行,截图如下:
判断是否有自定义别名包,如果有加载别名包里面的类,解析包里面的类添加到Class对象中,添加的过程排除自定义别名包里面的接口,然后调用MybatisConfiguration的getTypeAliasRegistry()方法获取TypeAliasRegistry对象然后调用TypeAliasRegistry对象的registerAlias方法,参数是Class集合对象中每一个元素,registerAlias对象方法截图如下:
registerAlias方法截图
获取type类的简单名称,判断class对象是否有Alias注解,如果有使用此注解名称覆盖type类的简单名称,如果没有使用type类的检查名称,把alias以key放到map中,value值是type对象,接着往下执行判断是否有插件数组,如果有插件则调用
targetConfiguration.addInterceptor方法添加到最终对象InterceptorChain成员属性interceptors集合中。接着判断是否有自定义的typeHandlers,如果有调用MybatisConfiguration的getTypeHandlerRegistry()方法获取TypeHandlerRegistry对象然后调用register方法,参数是TypeHandler对象,把自定义TypeHandler对象设置到typeHandlerMap的map数据上。接下来构建MybatisConfiguration对象的Environment属性,该成员属性id是MybatisSqlSessionFactoryBean的简单名称,
该成员属性TransactionFactory是
SpringManagedTransactionFactory,该成员属性dataSource是容器中的数据源,构建完Environment对象设置到MybatisConfiguration的Environment成员属性上,下面判断mapperLocations是否为空,如果不为空解析mapper.xml中的标签,关于此部分属于有一段解析crud的sql语句的逻辑,这正是Mybatis-Plus不用写增删改查的sql语句的原因,Mybatis-Plus已经帮我们处理了,整个部分我们下节详细分析,最后创建了一个DefaultSqlSessionFactory对象返回整个方法结束。
总结:
MybatisSqlSessionFactoryBean对象的getObject()方法的主要处理逻辑就是设置自定义相应的别名包中的类、自定义的java类和数据库映射的TypeHandler设置到MybatisConfiguration对象上,同时解析mapper.xml中的标签和CRUD的sql语句到MybatisConfiguration对象上,最后MybatisConfiguration对象设置到SqlSessionFactory对象成员属性上进行返回,这样就有了数据库各种的sql语句了