读了周勇老师的《从零开始写javaweb框架》,感觉干货还是挺多的。想把自己的收获分享给大家。不过,这本书中的从零开始并不是指的零基础,而是从无到有。所以,还是建议有一定web基础的朋友们阅读,最好是对Spring的IOC、AOP有一定了解。

总体印象

这本书一共有五章。首先要告诉大家,我没有读完,只是精读了前两章、粗读了三四章,第五章大致浏览了一下,以后如果还有什么新的感悟,还会再分享。还是先说说目前的感受吧。

看的出来,作者水平很高,这本书也差不多将web框架常用知识和框架脉络梳理了一遍。但是说它需要有一定基础的朋友们阅读主要有两个原因:

  1. 书中错误比较多,需要读者有一定的纠错能力。我在读第一章第二章的时候遇到了不少错误,主要都是一些细节性的错误。读者应该在遇到书中错误的时候,能够明白作者的意图并正确处理书中的细节问题。
  2. 书中对基础知识介绍较少,大部分都是直接贴代码,而且注释很少,读者应该能够看得懂这些代码。我就是在这里遇到了困难,在读一些比较困难的代码时失去了耐性,比如如何动态的将带有IOC注解的类注入到IOC容器。以至于后面的代码都没有细读。

大家如果还是不知道自己是否适合这本书,可以看一下豆瓣的书评

收获

即使如此,读了这本书我也收获颇丰,也学习到了作者的一些编程的小技巧,把他分享给大家,希望对大家有所帮助:

  • 说到读取配置文件,大家会想到什么方法呢?

我首先想到的就是FileInputStream类,但是大家都知道这个类的使用是非常麻烦的。像我这样基础不牢的coder要在网上找个例子估计才能写。但书中给我们提供了一种非常简单的方法,令人耳目一新。

InputStream is  = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);

备注:此方法要求配置文件必须在项目的classpath下。

  • 在封装通用jdbc的方法的时候我总是因为ResultSet和Entity类的转换问题而纠结。这里书中为我们介绍了ResultSetHandler这个类,这个类在用于将ResultSet转换为实体对象时十分有用,下面给大家一个例子,大家有兴趣的话可以了解一下,这是在apache的DBUtils的jar包下:
    /**
     * 查询实体类
     * 
     */
    public static <T> T queryEntry(Class<T> entityClass, String sql, Object... params) {

        T entity = null;
        try {
            entity = queryRunner.query(getConnection(), sql, new BeanHandler<T>(entityClass), params);
        } catch (SQLException e) {
            logger.error("query entry failure!", e);
            new RuntimeException(e);
        } finally {
            closeConnection();
        }
        return entity;
    }

这里因为是我的弱点,我就详细介绍一下ResultSetHandler这个类,这个类有很多子类,于将查询到的ResultSet转换为不同种类的对象:

  • BeanHandler —— 返回Bean对象;
  • BeanListHandler —— 返回List对象;
  • BeanMapHandler —— 返回Map对象;
  • ArrayHandler —— 返回Object[]对象;
  • ArrayListHandler —— 返回List对象;
  • MapHandler —— 返回Map对象;
  • MapListHandler —— 返回List<Map>对象;
  • ScalarHandler —— 返回某列的值;
  • ColumnListHandler —— 返回某列的值列表;
  • KeyedHandler —— 返回Map对象,需要指定列名;

它们的继承关系如图所示:

clipboard.png

  • 在获取Connection时为了保证线程安全,应该使用ThreadLocal将Connection包裹起来,这都是我在平时写代码时没有注意到的。
    /**
     * 使用ThreadLocal保证Connection线程安全
     */
    private static final ThreadLocal<Connection> connectionHolder = new ThreadLocal<>();
  • 单单使用ThreadLocal还并不完美,为了防止频繁的开启和关闭Connection我们还需要有一个数据库连接池,虽然我以前也用连接池,但是只是教程教的让用我就用,并没有理解其中的原理。常用的数据库连接池有DBCP 、C3P0。

内容介绍

第三章之后我看的就不太仔细了,原因前面也说了,代码写的有点难懂,注释也少,很多都是在编写工具类。我是看着有点晕。也可能是我太菜了。让大家笑话了。这里就给大家大概介绍一下主要内容吧。

第三章讲的是IOC容器相关的知识,主要讲IOC容器如何加载Bean对象。

第四章讲的比较详细。第一部分从静态代理讲到动态代理,再讲到什么是JDK代理、CGlib代理、Spring的AOP机制最后讲到Spring + Aspect。

第二部分讲了ThreadLocal和事务。

第五章讲了 Action的优化、文件上传和下载、集成Shiro安全框架和CXF框架。

后面的我都是大概浏览了一下大概内容,并没有仔细的研究。大家也可以根据自己的需要学习其中的某一部分。
如果大家看了这本书有什么新的感悟,也欢迎分享给我。

这是黄勇老师的关于smart-framework的博客,大家如果对这个框架有兴趣的可以关注一下:https://my.oschina.net/huangy...


不吃香菜
244 声望64 粉丝