[java][源码分析]paoding-rose-jade框架源码分析(1)

原创 2017年08月24日 11:48:14

在实习期间遇到最多的两个框架就是spring和paoding-rose了,所以看完spring源码分析的书,我就迫不及待的开始找paoding-rose的书了。可惜没找到,所以就自己动手分析吧。
spring源码分析的书可以在这里下载:
http://download.csdn.net/download/qq523786283/9946552

1.正文

paoding-rose框架包含很多子框架,而我实习的公司项目中只用到paoding-rose-jade。所以我这里分析的是paoding-rose-jade。
我选择的分析的入口是下面图片里选择的类:
这里写图片描述
理由是我们可以通过单元测试类更轻松的知道代码作者的设计意图。
先贴出单元测试源码:

/**
 * 通过集成DAO和JadeFactory,验证 {@link DataSources}的可用
 * 
 * @author 王志亮 [qieqie.wang@gmail.com]
 * 
 */
public class DataSourcesTest {

    @DAO
    interface UserDAO {

        @SQL("create table user (id int, name varchar(200));")
        void createTable();

        @SQL("insert into user (id, name) values(:1, :2);")
        void insert(int id, String name);

        @SQL("select name from user where id=:1")
        String getName(int id);

        @SQL("select name from user order by id asc")
        String[] findNames();
    }

    // init方法负责初始化dao
    private UserDAO dao;

    @Before
    public void init() {
        DataSource dataSource = DataSources.createUniqueDataSource();
        JadeFactory factory = new JadeFactory(dataSource);
        dao = factory.create(UserDAO.class);
        dao.createTable();
        dao.insert(1, "zhiliang1");
        dao.insert(2, "zhiliang2");
    }

    @Test
    public void testGetName() {
        Assert.assertEquals("zhiliang1", dao.getName(1));
    }

    @Test
    public void testFindNames() {
        String[] names = dao.findNames();
        Assert.assertEquals(2, names.length);
        Assert.assertEquals("zhiliang1", names[0]);
        Assert.assertEquals("zhiliang2", names[1]);
    }

}

相信用过paoding-rose-jade都会对下面这段代码感到非常的熟悉,没用过的也能清晰知道它定义了一个接口。唯有@DAO@SQL注解需要我们推测它们的用途。

    @DAO
    interface UserDAO {

        @SQL("create table user (id int, name varchar(200));")
        void createTable();

        @SQL("insert into user (id, name) values(:1, :2);")
        void insert(int id, String name);

        @SQL("select name from user where id=:1")
        String getName(int id);

        @SQL("select name from user order by id asc")
        String[] findNames();
    }

这些推测都暂且放下,我先看到被 @Before 注解标记的 init() 方法。根据junit4单元测试类的规则,每个 @Test 标记的方法运行前都有运行一次被 @Before 注解标记的方法。
init()
1.生成一个数据源对象(DataSource)
2.通过数据源对象(DataSource)生成一个工厂对象(JadeFactory)
3.通过调用JadeFactory对象的create(UserDAO.class) 方法,获得一个实现UserDao接口的对象。
4.接下来就是我们熟悉的数据库操作了。

    @Before
    public void init() {
        DataSource dataSource = DataSources.createUniqueDataSource();
        JadeFactory factory = new JadeFactory(dataSource);
        dao = factory.create(UserDAO.class);
        dao.createTable();
        dao.insert(1, "zhiliang1");
        dao.insert(2, "zhiliang2");
    }

看到第3步时,相信大家都有一个相同的问题:
我们没实现UserDAO接口,何来一个实现UserDAO接口的对象呢?
对于这个,我给出的推测是paoding-rose-jade使用了动态代理。
为什么说是“推测”呢?因为我是抱着学习的心态写这篇博客的,无论对错都是我分析的过程,也就是说我是一边开始学习paoding-rose-jade框架源码一边写博客的。
现在就让我们一起解答这个问题吧。
这时选择单元测试类作为入口的另一个好处就显现出来了—我们可以通过调试代码来解决我们的问题。
首现如图下个断点,并debug:
这里写图片描述
从调试信息中我们可以看到dao对象在内存中的信息是{$Proxy3@1308} ,从名称可以推测它是一个代理对象,当然这并不严谨。
所以我们按F7跟入createTable() 方法继续调试。如下:
这里写图片描述

这里写图片描述
跟进去后我们发现我们到了一个陌生而又熟悉的invoke()方法.
没错这个是java动态代理的方法,这证明了我们的推测是正确的。没学过java动态代理的同学可能会感到一头雾水,这时候就需要你们自己去百度或谷歌一下了。
从调试信息中我们可以看到invoke()方法中传进去的Proxy对象在内存中的信息是{$Proxy3@1308} ,所以这个就是前面的dao对象。
接下来的内容就下一篇再继续吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。

[java][源码分析]paoding-rose-jade框架源码分析(2)

在分析动态代理回调的invoke 方法之前,我们先看下factory.create(UserDAO.class) 里面做了什么。1.JadeFactory工厂分析JadeFactory类的代码如下:p...
  • qq523786283
  • qq523786283
  • 2017年08月24日 16:18
  • 3789

thinkphp 源码分析(一)

在工作中,我接触到了国人开发的thinkphp框架,也许对于大多数童鞋来说,就是简单的用用,但是作为一名技术的爱好者,还是不放弃一丝希望,认真的开始读thinkphp的源码,但是对于很多的牛牛们来说,...
  • BenShuHuai
  • BenShuHuai
  • 2015年08月15日 10:39
  • 1684

分析java源代码/开源框架源码的思路?

讨论下大家分析源代码的思路,遇到源代码是怎样去分析的? 我的思路基本是这样的: 1.弄清楚这个框架 是做什么用的。分解功能 2.分解功能出来后,针对每个功能画出类框架图 3.找...
  • xyw591238
  • xyw591238
  • 2016年04月18日 11:19
  • 676

Netty框架及源码知识点

1、Netty的网络模型http://blog.csdn.net/hbtj_1216/article/details/753319952、Reactor模式和Proactor模式http://blog...
  • hbtj_1216
  • hbtj_1216
  • 2017年08月08日 21:03
  • 221

thinkphp3.2架构及源码理解

主要理解 1.配置 2.MVC模式; 3.url路由解析 4.CBD模式(核心Core+行为Behavior+驱动Driver) 5.编译缓存 官方给出的系统流程,有助于理解框架的运行过程: 用户UR...
  • zhengxiaojunkite
  • zhengxiaojunkite
  • 2016年02月29日 20:14
  • 2795

Java 并发 --- Exchanger源码分析

Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,...
  • u014634338
  • u014634338
  • 2017年12月07日 20:42
  • 163

React源码分析1 -- 框架

1 源码结构我们分析的React源码version为16.0.0-alpha.3,源码目录如下图所示。含义如下 addons:插件,一些比较有用的工具,如transition动画 isomorphic...
  • u013510838
  • u013510838
  • 2017年02月18日 18:42
  • 1927

解读flask框架,flask源码解读

一、建立路径关系 装饰器 此处endpoint,options 此处增加了self.view_functions的对应关系 二、启动 运行werkzeug的run_...
  • xx123er
  • xx123er
  • 2017年07月27日 11:27
  • 163

Java集合框架常用类源码分析与总结

Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭...
  • zhoubin1992
  • zhoubin1992
  • 2015年10月06日 21:26
  • 898

SSM框架搭建及源码解析--框架搭建(一)

主要简单的搭建了一个SSM框架
  • zhengxu189891
  • zhengxu189891
  • 2017年03月15日 11:00
  • 406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[java][源码分析]paoding-rose-jade框架源码分析(1)
举报原因:
原因补充:

(最多只允许输入30个字)