今天是劉小愛自學Java的第120天。
感謝你的觀看,謝謝你。
今天學習內容安排如下:
對ssm框架有一個了解。IoC控制反轉的xml配置管理,這也就是spring框架的核心知識點之一。DI依賴注入的實現。一、SSM框架概述
這個框架啊,估計就跟婚姻一樣,也有七年之癢之說,以前呢也有一套框架叫SSH。
久而久之之後就覺得這也不好那也不好,於是就出現了一套新的框架叫SSM。
SSM框架:SpringMVC、Spring、MybatisSSH框架:Struts2、Spring、Hibernate倒不是說SSH完全被淘汰了,但除了傳統行業,基本很少用了,我們只學SSM,不學SSH。
框架的出現其實也就可以理解成為了更好地優化經典三層架構,使其更加地強大:
①Web層
我們前面一直使用的servlet也就是Web層,直接使用servlet雖然說也行,但是會有各種各樣的問題。
所以就出現了對應的web層框架:SSH中的Strutes2、SSM框架中的SpringMVC。
我們後續要學的就是SpringMVC。
②Business業務層
也就是前面一直在說的service層,反正各種各樣的名稱,都是指業務層 。
③EIS持久層
也就是dao層、mapper層,數據持久層,操作資料庫的,無外乎就是增刪改查。
前面學過的jdbc、jdbcTemplate、mybatis都是和這層是相關的,SSH框架中的hibernate,還有後續要學的SpringDateJPA都是。
而我們今天要學的spring框架也就對應著業務層:
無論是SSM框架還是SSH框架都有Spring,足以證明其重要性。
核心點主要有三點:Ioc控制反轉、AOP面向切面編程、以及事務控制。
當然spring框架體系太龐大了,涉及到的知識體系挺多的,以後會一點點學習,也就是所謂的spring全家桶。
二、Spring配置信息
我們以前Java代碼是如何寫的?
service層和dao層都是一個接口對應一個實現類,調用時直接new一個實現類對象。
但是這樣做有一個問題:
代碼耦合度高,也就是說實現類如果發生了變化,要換成另一個,代碼要修改。
而spring框架就能解決這個問題,其實現思路無外乎就是這麼個思路:
工廠設計模式+反射 + xml配置文件
反射有一個特點:由它創建的類也好、方法也罷,亦或是屬性,都是可以動態變化的。
如何動態變化,利用配置文件將類、方法名、屬性字符串動態獲取。
1Spring核心配置文件創建
創建步驟如下圖:
在resources中new一個XML配置文件,選擇Spring Config即可。
如果是以前,需要創建一個xml文件,再去spring官網copy配置文件模板。
這是得益於idea開發工具的便利,同時也從側面說明了spring的重要性。
mybatis框架中配置文件模板不就需要我們自己去官網copy麼?
2spring配置信息說明
bean,豆、咖啡豆的意思。這涉及到一個Java名稱由來的一件軼事:
Java創始團隊中,有一名成員在爪哇島上曾喝過一種美味的咖啡。
於是就給這門計算機程式語言命名為Java,所以Java也被叫做爪哇,就是取自爪哇島。
其圖標也就是一杯熱咖啡,而Java中非常重要的對象就是這種咖啡豆,也就是bean。
而spring框架中通過<bean>標籤,就可以實現對Java對象的管理。
配置完成,那它是如何使用的呢?
三、Spring IoC快速入門
IoC全稱為Inverse of Control,控制反轉的意思,這是一種思想,能解決代碼耦合問題。
1通過spring獲取對象
①工廠設計模式
ClassPathXmlApplicationContext這一大串就是使用的工廠設計模式。
我大致說下對工廠設計模式的理解:
我們的項目是部署在伺服器上面的,一般來說伺服器基本是不會停的,為了用戶體驗需要保證一直運行。
項目運行後,我們只需要創建一次工廠對象,後續需要那個對象直接使用工廠獲取。
因為伺服器不停,對象就一直存在,所以如果對象用完了就需要釋放資源,我們前面很多時候使用close()方法關流就是這麼個道理。
而工廠對象不用釋放資源,就可以一直用它。
再次強調:這一塊的理解我並沒有專門花時間去查資料學習,只不過隨著自己不斷地學習對其有了一定的見解,不一定準確,有問題後續會補充說明。
②反射
根據類的全限定名創建Class對象,再通過newInstance()實現該類的實例化。
我上述寫的就是這麼個實現思路,利用反射實例化對象,而參數就是由配置信息確定。
至於具體是如何確定的,需要去翻spring框架的源碼,很複雜。
2依賴注入的實現
好,現在問題又來了:
spring獲取對象確實解決了高耦合的問題,但是每次都要使用工廠獲取對象太麻煩。
能不能只需獲取一個對象,其它和這個對象相關的就自動完成獲取了?
就需要使用到DI依賴注入了:
通過property子標籤,根據類中的setter方法進行依賴注入,需要使用到兩個屬性:
name:即setxxx方法中的xxx。ref:引用哪一個對象。依賴注入它有一個使用前提,就是被注入的對象中需要有set方法。
這樣能有什麼效果呢?
如果沒有依賴注入的話,需要多次spring工廠獲取對象;有了依賴注入的話,只需要一次獲取對象,其相關的對象也就完成了初始化。
最後
謝謝你的觀看。
如果可以的話,麻煩幫忙點個讚,謝謝你。