Spring學習筆記(一)——綜述篇

Motivation

最近看到數年前的電視劇《漢武大帝》中的一個片段:漢武帝偶得一柄匈奴寶刀,當即讓身邊的將軍拔出自己的佩劍來比試一番,看哪一個更鋒利。誰知漢武帝只是用力一劈,將軍的漢劍便斷作兩截。漢武帝很是驚愕,詢問獻刀之人方知,匈奴人從西域學得了比漢朝更先進的冶鋼技術。因此……

歷史上,無論是農業上還是軍事裝備上的技術革新,總能帶來一個國家實力的提升,新的工具逐漸提高着人的生產力。

回到我們的正題中,隨着各種編程語言的發展,出現了越來越多的新技術,譬如這篇博文的主角——Spring。其實這個名字我很早就聽說過了,但是一直沒有做出學習他的行動,受上述劇情的啓發,我覺得是時候了。畢竟用鐵劍去和匈奴人拼鋼刀是要吃敗仗的。


Spring是什麼?

關於Spring是什麼這個問題,大家可以直接問度娘,百度百科上的定義最後一句總結說:

Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

看着這種官方的定義,想必沒有幾個人能真正的瞭解它是什麼。

對於一個工具——譬如榔頭,你只需給我演示一下它能敲釘子,還能砸核桃,那麼我就能大致的理解它是什麼了。

因此,關於他能簡化開發,讓開發者少寫代碼這諸多好處之一,我們做一個比較:
一般情況下,我們寫UserDAO(用戶數據訪問對象,用來封裝對數據庫中User表所做的任何操作的類)中的queryUser函數大致如下:

    public static User queryUserById(String id) {

        //獲得數據庫的連接對象
        Connection connection = DBManager.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        //生成SQL代碼
        StringBuilder sqlStatement = new StringBuilder();
        sqlStatement.append("SELECT * FROM user");
        sqlStatement.append(" WHERE Id=?");

        //設置數據庫的字段值
        try {
            preparedStatement = connection.prepareStatement(sqlStatement.toString());
            preparedStatement.setString(1, id);
            resultSet = preparedStatement.executeQuery();

            User user = null;
            if (resultSet.next()) {
                user.setId(id);
                user.setName(resultSet.getString("Name"));
                user.setPhoneNumber(resultSet.getString("PhoneNumber"));
                user.setEmailAddress(resultSet.getString("EmailAddress"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBManager.closeAll(connection, preparedStatement, resultSet);
        }
    }

而使用了Spring框架後,同樣的功能就只需要以下的代碼:

    public User queryUserById(int Id) {
        String sqlStatement = "SELECT * FROM user WHERE UserID=?";
        User user = null;
        jdbcTemplate.query(sqlStatement, new Object[]{Id}, (rs) -> {
            if (rs.isFirst()) {
                user = new User();
                user.setId(id);
                user.setName(resultSet.getString("Name"));
                user.setPhoneNumber(resultSet.getString("PhoneNumber"));
                user.setEmailAddress(resultSet.getString("EmailAddress"));
            }
        });
        return user;
    }

通過對比,我們可以發現兩段代碼有以下不同之處:
①第一段31行(去掉用於使代碼分段清晰、美觀的空行爲27行),第二段14行,很明顯得少了近一半的代碼;
②Spring方式不用手動定義數據庫連接、結果集等代碼;
③Spring方式不用手動處理各種數據庫相關的異常;
④Spring方式封裝了JDO中給”?”賦值的語句,如果sql中帶填入的參數(即”?”的數量)越多,這裏的優化越明顯。

基本上,除了必須由我們來編寫的sql語句和構建查詢結果對象的代碼之外,其它的簡單重複勞動Spring框架都已經代勞了。這便是Spring框架諸多優點中九牛之一毛。

關於Spring其他的優點,以下摘自《Spring 3.x企業應用開發實戰》:

①方便解耦,簡化開發
通過Spring提供的IoC容器,我們可以將對象之間的依賴關係交由Spring進行控制,避免硬編碼所造成的過度程序耦合。有了Spring,用戶不必再爲單實例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注於上層的應用。

②AOP編程的支持
通過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應付。

③聲明式事務的支持
在Spring中,我們可以從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。

④方便程序的測試
可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring裏,測試不再是昂貴的操作,而是隨手可做的事情。

⑤方便集成各種優秀框架
Spring不排斥各種優秀的開源框架,相反,Spring可以降低各種框架的使用難度,Spring提供了對各種優秀框架(如Struts、Hibernate、Hessian、Quartz等)的直接支持。

⑥降低Java EE API的使用難度
Spring對很多難用的Java EE API(如JDBC、JavaMail、遠程調用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些Java EE API的使用難度大爲降低。

⑦Java源碼是經典學習範例
Spring的源碼設計精妙、結構清晰、匠心獨用,處處體現着大師對Java設計模式靈活運用以及對Java技術的高深造詣。Spring框架源碼無意識Java技術的最佳實踐的範例。


系列博文

按照以往的習慣,索引就放在綜述帖中。

Spring學習筆記(一)——綜述篇(2018.07.04)

Spring學習筆記(二)——基礎篇(2018.07.05)

Spring學習筆記(三)——配置篇(2018.07.09)

Spring學習筆記(四)——IoC進階篇(2018.07.11)

Spring學習筆記(五)——配置信息進階篇(2018.07.16)

Spring學習筆記(六)——AOP篇(上)(2018.07.19)

Spring學習筆記(七)——AOP篇(下)(2018.07.20)

Spring學習筆記(八)——數據訪問篇(2018.07.30)

Spring學習筆記(九)——Spring MVC篇(2018.08.03)


更新日誌

因爲覺得再這樣閉門造車下去是斷斷不行的,因此便想到學習一下Spring。從開始學到現在尚不足一週,但困難已經遇到了一籮筐,當然,學到的東西也很多。所以急於將這期間的所思所想和學到的東西記錄下來。
因爲尚沒有學完,因此這套博文我會一邊學一邊寫。
——2018.07.05

花了三天時間,終於寫完了第三篇——配置篇,寫的比較詳細,篇幅比較長,靜下心來看會有收穫的。
——2018.07.09

到目前爲止,對AOP知識的學習是比較愉快的,因爲確實解決了我在開發中遇到的,思考過之後仍沒有解決的問題。花了兩天時間,把AOP的只是分了上下兩篇寫完。已經掛上了鏈接,對龐雜的AOP知識有部分摘撿,在後面的學習中如果發現某些知識是必要的,我會再填上。
——2018.07.20

斷斷續續花了三天,寫完了數據訪問篇。知道了什麼叫持久層,也見識到Hibernate這些框架的強大功能。一定要不斷學習新的東西啊,不能總是作一個偏安於石器時代的原始人。
——2018.07.30

最近幾天略有些忙,不過還是擠出了一部分時間學習,然後寫完了Spring框架基礎知識的最後一篇博文。如果之後學到新的進階知識,我會續寫新的博文來分享。
——2018.08.03


後記

學習新東西的過程總是充滿了挫折,但是最後回過頭來,我們會發現,我們所付出的努力都是值得的。在學校裏的學生最大的問題,就是知識過於陳舊,剛畢業就被真實的商業開發環境淘汰掉了。因此,想成爲一個跟得上時代的合格的軟件工程師,學習並掌握當前工業界最新的開發工具是理所因當的。

相較於理論,我在博文更注重於應用。因此,可能這些文章中有一些概念上說的不到位的地方,請多多包涵。

如果你發現了博文中的任何錯誤,請在對應博文的下方直接回復,我會盡快修改,避免誤導了大家。

如果在實現中出現了自己難以解決的問題,我的郵箱是[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章