mybatis源码(2)--------以注解方式实现对于数据的操作流程(与spring结合使用)
上一篇介绍了xml配置方式使用mybatis,这里将会介绍以注解方式使用mybatis
mybatis在spring中的配置书写,注意到这里的datasource为spring jdbc的dataSource,此处也可以配置成为其它如何driud,c3p0等等数据库连接池。
如图所示为核心的操作注解方式使用mybatis文件,完成对于配置类的加载,对于mapper解析之后创建对应的代理对象放入到ioc容器中。
此方法会创建一个扫描器后续将会用到,同时将配置类的beandefinition放入bean,可以看到这里的registry为AnnotationConfigApplicationContext即为一个容器对象,之后会将配置的beandefinition信息注入到GenericApplicationContext这个容器对象中
beanFactory属性的beandefinitionMap中,在之后refresh()将会获取到这个beanFactory对其内部的beanDefinitionMap进行解析操作。
此方法会对于mapper的beanDefintion生成相关的beanDeifnition对象的一些属性进行设置操作。
这里的为ioc容器的重要方法refresh方法,前面都是前戏操作,主要到invokeBeanFactoryPostProcessors方法,此方法完成对于配置类上面的注解相关做一些解析操作,并扫描mapper接口相关生成对应的beanDefinition对象并放入到beanDefinitionMap中。
此方法完成MyBatis配置类相关的解析操作,获取mapper的扫描路径。
将会走到核心扫描处理类,实现对于mybatis相关注解的一些提取并解析的相关操作
扫描对应包下的接口,之后创建beanDefinition对象,为之后实例代理对象做准备操作
此处会对扫描生成的beanDefintion对象进行对应的实例化操作,同时也会将每一个mapper代理对象必须的属性sqlSessionFactory设置进入去,完成整个mapper代理对象的创建工作。
通过beanFactory方式结合mybatis创建代理对象,使用的是jdk动态代理,这里使用的代理方法和aop实现的有点区别,aop没有beanFactory相关的操作,同时aop支持cglib的方式
(附加信息)
如上图这是aop代理对象创建的常规入口,详细aop实现原理请看aop相关源码。
之后将会走到这里的方法使用jdk动态代理创建mapper相关的代理对象。finishBeanFactoryInitializztion方法会进行相关mapper接口解析操作,包括接口上的注解解析操作,代理对象的创建,以及二级缓存的创建操作操作,完成整体的mapper代理对象的实例化操作。
之后用户可以拿到对应的mapper代理对象对于数据库进行相应的操作,至于此处的bean创建操作,请看spring源码相关bean定义与ioc等相关。
附加信息关于mybatis中事务处理,mybatis中事务处理与所使用数据库连接池有关,具体使用如下图所示,通常使用的是spring事务来进行事务的处理工作。
-----------------------------------------到此mybatis注解方式使用解析