從零開始的WEB框架——感悟

讀了周勇老師的《從零開始寫javaweb框架》,感受乾貨仍是挺多的。想把本身的收穫分享給你們。不過,這本書中的從零開始並非指的零基礎,而是從無到有。因此,仍是建議有必定web基礎的朋友們閱讀,最好是對Spring的IOC、AOP有必定了解。

整體印象

這本書一共有五章。首先要告訴你們,我沒有讀完,只是精讀了前兩章、粗讀了三四章,第五章大體瀏覽了一下,之後若是還有什麼新的感悟,還會再分享。仍是先說說目前的感覺吧。java

看的出來,做者水平很高,這本書也差很少將web框架經常使用知識和框架脈絡梳理了一遍。可是說它須要有必定基礎的朋友們閱讀主要有兩個緣由:web

  1. 書中錯誤比較多,須要讀者有必定的糾錯能力。我在讀第一章第二章的時候遇到了很多錯誤,主要都是一些細節性的錯誤。讀者應該在遇到書中錯誤的時候,可以明白做者的意圖並正確處理書中的細節問題。
  2. 書中對基礎知識介紹較少,大部分都是直接貼代碼,並且註釋不多,讀者應該可以看得懂這些代碼。我就是在這裏遇到了困難,在讀一些比較困難的代碼時失去了耐性,好比如何動態的將帶有IOC註解的類注入到IOC容器。以致於後面的代碼都沒有細讀。

你們若是仍是不知道本身是否適合這本書,能夠看一下豆瓣的書評sql

收穫

即便如此,讀了這本書我也收穫頗豐,也學習到了做者的一些編程的小技巧,把他分享給你們,但願對你們有所幫助:數據庫

  • 說到讀取配置文件,你們會想到什麼方法呢?

我首先想到的就是FileInputStream類,可是你們都知道這個類的使用是很是麻煩的。像我這樣基礎不牢的coder要在網上找個例子估計才能寫。但書中給咱們提供了一種很是簡單的方法,使人耳目一新。apache

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...

相關文章
相關標籤/搜索