[java][源码分析]paoding-rose-jade框架源码分析(1)
2017-08-24 11:48
429 查看
在实习期间遇到最多的两个框架就是spring和paoding-rose了,所以看完spring源码分析的书,我就迫不及待的开始找paoding-rose的书了。可惜没找到,所以就自己动手分析吧。
spring源码分析的书可以在这里下载:
http://download.csdn.net/download/qq523786283/9946552
我选择的分析的入口是下面图片里选择的类:
![](https://img-blog.csdn.net/20170824103416392?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE1MjM3ODYyODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
理由是我们可以通过单元测试类更轻松的知道代码作者的设计意图。
先贴出单元测试源码:
相信用过paoding-rose-jade都会对下面这段代码感到非常的熟悉,没用过的也能清晰知道它定义了一个接口。唯有
这些推测都暂且放下,我先看到被
在
1.生成一个数据源对象(DataSource)
2.通过数据源对象(DataSource)生成一个工厂对象(JadeFactory)
3.通过调用JadeFactory对象的
4.接下来就是我们熟悉的数据库操作了。
看到第3步时,相信大家都有一个相同的问题:
我们没实现UserDAO接口,何来一个实现UserDAO接口的对象呢?
对于这个,我给出的推测是paoding-rose-jade使用了动态代理。
为什么说是“推测”呢?因为我是抱着学习的心态写这篇博客的,无论对错都是我分析的过程,也就是说我是一边开始学习paoding-rose-jade框架源码一边写博客的。
现在就让我们一起解答这个问题吧。
这时选择单元测试类作为入口的另一个好处就显现出来了—我们可以通过调试代码来解决我们的问题。
首现如图下个断点,并debug:
![](https://img-blog.csdn.net/20170824112617950?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE1MjM3ODYyODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从调试信息中我们可以看到dao对象在内存中的信息是
所以我们按F7跟入
![](https://img-blog.csdn.net/20170824113652522?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE1MjM3ODYyODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170824113852731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE1MjM3ODYyODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
跟进去后我们发现我们到了一个陌生而又熟悉的
没错这个是java动态代理的方法,这证明了我们的推测是正确的。没学过java动态代理的同学可能会感到一头雾水,这时候就需要你们自己去百度或谷歌一下了。
从调试信息中我们可以看到
接下来的内容就下一篇再继续吧。
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)
- net.paoding.rose —— jade模块源码分析
- 分析java源代码/开源框架源码的思路?
- java源码分析之集合框架 ArrayList和LinkedList的区别05
- Java 集合框架源码分析(三)——HashMap 转载BridgeGeorge Java 集合框架源码分析(三)——HashMap
- Java 集合框架源码分析(七)——HashSet
- 【Java源码分析】集合框架-Collections工具类-Arrays工具类
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
- java源码分析之集合框架Map 07
- java源码分析之集合框架HashTable 11
- Java 集合框架源码分析(一)——ArrayList
- java源码分析之集合框架TreeMap 12
- java 集合框架之LinkedList及ListIterator实现源码分析
- java源码分析之集合框架AbstractMap 08
- Java 集合框架源码分析(二)——LinkedList
- java核心之集合框架——HashMap源码分析
- Java 集合框架源码分析(三)——HashMap
- java源码分析之集合框架 fail-fast机制06
- Java依赖注入库框架 Dagger的源码分析(一)
- java源码分析之集合框架 ArrayList 03