mybaties:
总体上来说分为解析,执行两个部分,主线是:
程序的目的是获取SqlSession,通过工厂SqlSessionFctoryBuilder产生,对应的构造方法里面一个配置对象(Configuration),就是解析配置文件的结果。
第一步就是解析,使用的是XmlConfigBuilder去解析,得到Configuration配置对象,然后传递给DefaultSqlSessionFactory产生具体的SqlSession,最后由Session去负责执行的。
解析过程中主要操作如下,分2部分进行解析:
一个是全局的配置,创建对象Configuration,就是一些驱动,数据库url和连接信息
二个是对mapper文件进行解析,解析后的结果是MappedStatement,
MappedStatement存放的形式是一个Map,key是nameSpace+id,值的话就是MappedStatement对象,里面有一个重 要的解析:getBoundSql解析sql
将sql的文本形式解析成“?”的可以执行的语句,然后将占位的字段名称放入到一个集合里面list<ParameterMapping>, 刚好集合的索引位置对应sql中的参数位置
还会将参数的类型信息进行存储,ParameterType,后续反射赋值时进行类型匹配使用.
第二部分为解析阶段:将得到的SqlSessionFactory通过OpenSession方法得到SqlSession,
执行调用的是Executor,使用的是SimpleExecutor,
它里面其实就是对Statement的封装,默认的是PreparedStatement,就是jdbc层的CRUD了。
Spring:
IOC容器初始化过程
程序的入口就是ClassPathXmlApplicationContext,首先通过路径Location获取到Resource资源
初始化开始的工作都是从refresh方法开始的,里面的步骤开始初始化容器,国际化准备,初始化bean
其中有一部是初始化IOC容器,产生BeanFactory,最后产生的具体实例是DefaultListableBeanFactory,获取容器后就进行解析
得到BeanDefination对象(标签信息解析后对应的对象),该对象通过XMLBeanDefinationReader对象开始读取,此时容器就初始化完成,完成了
对BeanDefination的加载。
后续就是将刚刚的BeanDefination进行进一步解析,其实就是初始化bean,通过调用getBean方法进行.
bean的创建过程,主要由对象的创建,属性的注入(DI,属性名称和对应的值类型封装成了一个对象:PropertyValues,调用的方法populateBean)和初始化过程,除了进行init-method或者InitializingBean常规的初始化动作后,还有一个进行aop动态代理对象的产生了,其中aop的动态代理对象的产生就是在初始化过程完成
有一个处理是BeanPostAfterProcessor
代理对象创建过程
1、初始化时候进行AOP代理对象的生产,使用的方法是BeanPostAfterProcesser
2、使用ClassFilter和MethodMathcher进行匹配,最终要得到Advisor
3、得到Advierss,要代理的类,然后看prxoy target clss 表示要创建代理对象的类型
4、真正生产对象的类视角AopProxy,里面有JDK,和 cglib两者,用这两种代理方式产生代理对象
5、容器中存放的就是代理对象
事务
tx基于AOP实现
先解析,tx标签
然后事务管理器,
调用具体的DataSourceTransManager
底层使用的是jdbc或者jpa,具体的事务管理器就是调用jdbc去开启 关闭事务,使用就是数据库本身的事务机制。