🛫更多ssm知識見SSM_面向CRUD編程專欄
🚕本博客總結自黑馬程序員的ssm框架視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客主頁🚀🚀
目錄
1 Spring簡介
2 xml配置文件
3 依賴、數據注入問題
1 Spring簡介
? ? ? ? Spring是分層的Java SE/EE階段應用的full-stack輕量級開源框架,主要以兩個部分IOC??(Inverse Of Control 反轉控制)和AOP? (Aspect Oriented Programming 面向切面編程)為內核。所謂的full-stack就是說提供了web層的Spring MVC、DAO層的JDBC模板、業務層的事務管理等眾多的企業級應用技術,除此之外還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE企業應用開源框架。
? ? ? ? 了解完Spring是什么,接下來學習一下Spring的發展歷程,Spring框架的前身是IBM提出的EJB,2005年Spring之父羅德·約翰森(Rod Johnson)發表Expert One-on-One J2EE Development without EJB一書被認為是Spring框架的雛形,再后來經過幾年的發展就有了我們現在學習的Spring框架。
?從高斯林和約翰森兩位大佬的發型就能看出來,學Java必定是前途無量。
Spring體系結構
我們對Spring的學習是按照它的體系結構從下往上開始學習的
?Spring快速入門開發
學習Spring之前
????????在使用Spring之前想要在UserDaoDemo的main方法里調用UserDaoImple類中的save方法,就要先使用多態創建對象就是通過new創建,再使用創建出來的UserDao對象調用save方法。這樣做不好的地方就是:將創建對象寫死(固定)了,編碼過度耦合,代碼里面創建的是什么對象就只能用什么對象。
學習Spring之后
????????使用Spring就可以通過xml配置文件實現解耦合,通過xml配置文件的配置和getBean方法的配合就可以動態的修改創建對象,具體步驟如下:
目錄結構:
?第一步:通過maven導入spring-context對應的依賴坐標
第二步:編寫UserDao對應的接口和實現類?
?第三步:創建applicationContext.xml配置文件并配置id標識標識 UserDaoImpl類
第四步:在UserDemo中通過Spring的API獲得Bean并調用方法
控制端運行結果
紅色的是打印的日志信息而非報錯
2 xml配置文件
Bean標簽的配置
屬性:
id:Bean在Spring容器中的唯一標識,在一個xml配置文件內部所有Bean標識的命名不可與之重復
class:Bean的全限名,指定這個id標識所對應的Bean類。Spring框架底層利用反射通過這個全限名對應Bean類的無參構造器創建對象。
scope:指的是對象創建的模式,有以下五中取值
- singleton:是scope屬性的默認值,相當于餓漢單例模式,也就是說Bean對象只在使用xml配置文件創建Spring客戶端對象的時候創建一次,之后使用getBean方法獲取Bean對象的時候返回的都是之前創建好的Bean對象。singleton一共就在Spring的核心文件被加載時創建一次一個Bean對象存儲在容器里,當應用卸載銷毀容器時對象隨之銷毀。
- prototype:相當于多例設計模式,也就是說在每一次使用Spring客戶端對象的getBean方法時都會創建一個新的Bean對象并返回。prototype是使用幾次getBean方法就會創建幾個Bean對象,當對象長時間不用的時候就會被java的垃圾回收機器回收對象也就銷毀了。
- request:web項目中,Spring創建一個Bean對象并將其存入到request域中
- session:web項目中,Spring創建一個Bean對象并將其存入到session域中
- global session:web項目中,應用于portlet環境中,如果沒有portlet環境的話就相當于session
init-method:指定Bean類中的初始化方法
destory-method:指定Bean類中的銷毀方法
import標簽
import標簽是用來將其他配置文件的配置內容加載到這個配置文件中
?
?Bean實例化的三種方法:
- 無參構造方法實例化(重點):無參構造方法其實就是我們上面講的那些知識點
- 工廠靜態方法實例化:通過工廠中的靜態方法進行實例化,只需創建一個工廠類,類里面創建一個靜態方法,方法返回一個無參構造器創建的Bean對象,再設置xml文件即可
- ?工廠實例方法實例化:通過工廠中的實例方法進行實例化,與工廠靜態方法的區別就是,用于返回一個無參構造器創建的Bean對象的方法是實例方法,xml配置文件也不一樣,要更加復雜些。
3 依賴、數據注入問題
引出問題:
? ? ? ? 現在有這么一個情況,除了上面已經有的dao層之外,新建一個業務層service。service層的結構和dao層相似,也是一個接口和實現類。目錄結構如下:
UserServiceImpl類和UserDaoImpl類也都通過xml配置文件的bean標簽進行配置。
?此時有一個需求,就是要在service層的UserServiceImpl類里的cast()方法中調用UserDaoImpl類的save()方法,實現思想就是在UserServiceImpl類里的cast()方法中使用之前UserDaoDemo的那一套進行調用UserDaoImpl類的save()方法
?在新建的UserController類中使用那一套調用UserServiceImpl類里的cast()方法
這么一來,就可以在Spring容器外部將Dao組裝到了Service
?那么,有沒有一種方式,可以在Spring容器內部就將Dao組裝到了Service呢?有的,于是乎就出現了依賴注入。
依賴注入:
? ? ? ? 依賴注入(Dependency Injection)是Spring框架核心IOC(控制反轉)的具體實現。在編程的時候通過控制反轉就可以把對象的創建交給Spring 容器,IOC只是降低他們之間的依賴關系并不會消除依賴,service層仍會調用dao層的方法。那么,該如何將UserDao注入到UserService的內部呢?
依賴注入的兩種方式:
set方法注入
就相當于將userDao對象通過setUserDao方法當做一個參數直接傳給UserServiceImpl類中,當創建UserServiceImpl類的對象調用cast()方法時,cast()方法內部就會使用setUserDao方法傳過來的userDao對象調用save()方法
具體setUserDao方法參數的userDao對象是如何創建的,這就要到xml配置文件中設置了
xml配置文件的另一種配置方式的寫法,知道即可還是上面的<property>標簽的可讀性更加高
?通過set方法注入的方式,就可以在Spring容器內部時就將Dao組裝到了Service
?set方法注入的關鍵就是,xml配置文件<property>標簽將Dao組裝到了Service,并在再service層的實現方法上用set方法接收dao層的對象,并使用對象對dao層進行操作。
構造方法注入
創建一個有參構造器用于接收UserDao對象
使用<constructor-arg>標簽配置
?? set方法注入和構造器注入的方式其他都一樣,就是接收UserDao的載體set注入是私有屬性的setter方法、構造器注入是有參構造器,xml配置文件的標簽set注入是<property>、構造器注入是<constructor-arg>
set方式注入其他類型數據
????????以上兩種依賴注入的方式不只能用于注入對象,還可以用于注入普通數據類型、引用數據類型和集合數據類型,接下來就以set注入方式為例演示
普通數據類型
創建變量相應的setter方法
配置xml配置文件
?spring客戶端對象獲取Bean對象,并調用save方法
數組、集合、propetries
propetries是Java的一個類以鍵值對的形式存儲配置信息
setter方法
xml配置文件?
??spring客戶端對象獲取Bean對象,并調用save方法
總結(注入數據時配置文件的配置格式)
上圖傳作資源,如有用可自行下載:下載地址?
? ? ??
下一篇:【SSM面向CRUD編程專欄 2】Spring相關API 數據源(連接池)的配置 注解開發 整合junit?