《spring源码深度解析》spring Jdbc(Mybatis)
Spring的jdbc模块中处理除了提供了JdbcTemplate
等封装工具,还提供了对各种第三方持久层框架的封装,比如Mybatis,Hibernate,帮助开发者可以更高效率的进行业务开发,这里主要分析下spring中如何对mybatis实现的封装。关于Mybatis,可以参考相关笔记:[Mybatis]
Spring的jdbc模块中处理除了提供了JdbcTemplate
等封装工具,还提供了对各种第三方持久层框架的封装,比如Mybatis,Hibernate,帮助开发者可以更高效率的进行业务开发,这里主要分析下spring中如何对mybatis实现的封装。关于Mybatis,可以参考相关笔记:[Mybatis]
Spring在前面的基础上,提供了JDBC模块,其中包括了对jdbc和datasource等的封装,这里先简单梳理下其中的JdbcTemplate
,它是一个对JDBC使用的封装,提供了一套的模板,能让我们写持久层代码时减少多余的代码,简化JDBC代码,使代码看起来更简洁。
静态代理是指在虚拟机载入字节码文件时动态织入切面行为,相对于动态代理具有更高的效率,因为动态代理调用的过程中,还需要一个动态创建代理类并代理目标对象的步骤,而静态代理在启动时便完成了字节码增强,当系统调用目标类时将与调用正常的类没有区别,它以一种更底层、更松耦合的方式改变了一个类的行为。
使用面向对象(OOP)编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时(例如日志、安全检测等),只能在每个对象里引用公共行为,这样程序中就产生了大量重复的代码,不便于维护,所以可以使用面向切面(AOP)编程作为一个补充,Aop是横向的而OOP是纵向的。
前面介绍bean加载时都是站在BeanFactory
的角度上进行的,相当于将spring纯粹当成一个bean容器工具来使用。其实spring另外提供了一套接口ApplicationContext
,更加侧重于将BeanFactory
放在一个上下文中来使用,这样方便在其基础上做一些扩展。
前面梳理了BeanDefinition
的解析注册,接下来就是如何利用BeanDefinition
生产bean了,不过相比解析注册,bean的加载过程要复杂得多。主要还是针对单例场景,因为在其整个创建过程中需要考虑缓存复用,线程安全,循环依赖,以及AOP处理等问题。
下面就以beanFactory.getBean("xxx")
作为入口进行分析,尽量梳理出主要的实现思路和步骤。