一直想分析下框架的代码,之前也看过Spring等框架源码,但是看了似懂非懂的,这次要将分析的记录下,如果发现不理解可以再来重新看下这个记录,还是从简单mybatis-plus来分析下,为什么mybatis-plus?最近项目在使用这个。mybatis-plus在mybatis上做了一层扩展,详细了解请访问官网地址:mybatis-plus 项目依赖工具是maven, 引入的项目依赖如下:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.1.9</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
接下看一下spring boot加载的mybatis-plus的配置和
复制代码
上图可以看出mybatisplus-spring-boot-starter这个依赖中spring.factories文件中,spring
boot的EnableAutoConfiguration加载的MybatisPlusAutoConfiguration这个类,如果不熟悉spring boot
starter的使用的可以参考的这里
接下来可以看下MybatisPlusAutoConfiguration里是如果初始化配置的。
从注解的角度看
- @Configuration是将该类加入spring容器当中,
- @ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})
- SqlSessionFactory,MybatisSqlSessionFactoryBean类的的依赖存在。
- @ConditionalOnBean(DataSource.class) DataSource这个实例必须存在
- @EnableConfigurationProperties(MybatisPlusProperties.class) 加载配置到MybatisPlusProperties这个类中
- @AutoConfigureAfter(DataSourceAutoConfiguration.class) 其他的类加载完之后,再加载DataSourceAutoConfiguration这个类,它主要是完成数据配置初始化。 接下来,看一下 SqlSessionFactory的构造,
@ConditionalOnMissingBean是在Spring容器中缺少bean的时候,创建SqlSessionFactory这个对象,前面已经创建了DataSource这个对象,这个实例在 这个方法中会自动注入进来,这是Spring的IOC来完成的, 这个类中,会创建一个MybatisSqlSessionFactoryBean的实例,它是实现Spring中FactoryBean接口的类,然后在这个实例中设置DataSource,VFS,ConfigLocation,MybatisConfiguraition(它是继承与Mybatis的Configuration)等属性
SqlSessionFactory的创建的下半部分,可以看出,都是给MybatisSqlSessionFactoryBean设置各种属性,最后一句是最重要的是,调用MybatisSqlSessionFactoryBean的getObject()的方法. 可以看到getObject获取SqlSessionFacoty,会调用afterPropertiesSet()afterPropertiesSet紧接着会调用 buildSqlSessionFactory()方法 。 可以从图上看出,如果是在configLocation的路径存在,则加载自定义的batisConfigBuilder对象,采用springboot的配置加载,所以这里configcation不存在的,所以只会走第一个分支,将配置属性都设置到configurion这个对象中。 那么接下来的一段代码就是为扫描配置的实体的路径,以及注册别名了, 这注意一下,如果mybatis中想为实体定义别名,则可以在实体上加上@Alias("xx")注解来标注,如果不加,则默认是英文全小写来标识别名。 接下来就是注册插件和类型转化处理了。 接下来是设置事务管理器,这里可以看到默认是用SpringManageTransactionFactory,然后设置全局配置,以及利SqlSessionFactoryBuilder传入configuration创建一个DefaultSqlSessionFactory对象,它创建的DefaultSqlSession再注入到SqlSessionTemplate对象中,SqlSessionTemplate才是真正与数据库交互的类, 接下最重要的是扫描加载mapper映射的xml,解析的工作是由XMLMapperBuilder的parse()方法完成的.具体即系,大家感兴趣可以自己去看下。不过回去介绍它是怎么使用注解写sql的,毕竟现在注解比较流行点吧,但是在凭借sql方面还是要弱于xml的, 到了这里,似乎忘了,mapper的扫描和注册到configuration的过程,由于创建SqlSessionFactory的过程太长,所以还是留在下一篇介绍吧。
总结: 今天主要介绍了基于springboot加载mybatis-plus的配置和SqlsessionFactory的构造,初次写源码级别的分析,写得不好,如果发现理解上的错误,希望大家多指教,谢谢!