spring源代码-mybatis(1)

来源:互联网 发布:公安优化发展环境心得 编辑:程序博客网 时间:2024/05/21 14:56

应用启动的时候,加载两个核心的bean

<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="dataSource_node1"/>    <property name="mapperLocations" value="classpath*:/mybatis/mappers/*.xml"/></bean>
初始化这个bean之后,我们构造出一个dataSource




还构造出一个sqlSessionFactory,持有一个configuration,configuration中持有mappedStatements,这个mappedStatements是读取和解析了mapper.xml文件生成的,这是个map结构,如下图



显然,这个map里面存储了mapper的方法和mappedStatement对象的映射

总结一下,sqlSessionFactoryBean初始化主要是读取dao.xml构造出数据源,读取解析mapper.xml,构造出mapper方法(字符串)和mappedStatement的映射

再来看另一个核心的bean

这个bean对应的class实现了BeanFactoryPostProcessor,根据前面文章讲上下文加载的时候,会找出对应类实现了BeanFactoryPostProcessor的bean,执行它的核心方法。这个bean的方法执行内容是扫描所有的mapper接口,将其注册到BeanFactory的beanDifinition中,从而将mapper托管给spring容器下面我们看下mapper的实例化和service层注入mapper下面是根据activityMapper的bean定义实例化之后生成的对象

此时beanFactory中存储的单例

显然bean工厂中存储的activityMapper是mapperFactoryBean,并没有实现mapper接口,那service依赖mapper的时候怎么办呢?毕竟我们需要注入的是一个mapper类型的,当serivice需要注入mapper时,它会先去beanFactory获取这个bean,获取到以后,判断是否是FactoryBean,如果是,进行特殊处理,具体细节不在描述,最后执行到MapperProxyFactory的newInstance方法,动态为mapper生成一个实现类,并且实例化出对象,注入到service中。看下这个最终实例化出的对象,下面将这个对象的className,superclass,interface都输出了出来

显然这个对象是$Proxy26@5244,对应的类继承了Proxy,实现了ActivityMapper,类名为com.sun.proxy.$Proxy26,这个代理对象持有一个h,即MapperProxy对象,这个很关键,下一篇讲mapper方法的执行过程的时候会再提起,但是我们发现一个问题,toString输出有问题,因为toString被动态代理了,输出的内容取决于代理的方法怎么写了,下篇会将动态代理类的源代码贴出来,大家可以看下这个toString怎么写的

原创粉丝点击