解析Spring核心技術IoC、AOP
B、引用類型
當指定bean 的某屬性值為另一bean 的實例時,通過ref 指定它們間的引用關系。ref 的值必須為某bean 的 id 值。
對于其它Bean 對象的引用,使用<bean/>標簽的ref 屬性
測試方法:
(2) 構造注入(理解)
構造注入是指,在構造調用者實例的同時,完成被調用者的實例化。即, 使用構造器設置依賴關系。
舉例 1:
<constructor-arg />標簽中用于指定參數的屬性有:
name:指定參數名稱。
index:指明該參數對應著構造器的第幾個參數,從 0 開始。不過,該屬性不要也行,但要注意,若參數類型相同,或之間有包含關系,則需要保證賦值順序要與構造器中的參數順序一致。
舉例 2:
使用構造注入創(chuàng)建一個系統類 File 對象
測試類:
引用類型屬性自動注入
對于引用類型屬性的注入,也可不在配置文件中顯示的注入?梢酝ㄟ^為<bean/>標簽設置autowire 屬性值,為引用類型屬性進行隱式自動注入(默認是不自動注入引用類型屬性)。根據自動注入判斷標準的不同,可以分為兩種:
byName:根據名稱自動注入
byType: 根據類型自動注入
(1) byName 方式自動注入
當配置文件中被調用者bean 的id 值與代碼中調用者bean 類的屬性名相同時,可使用byName 方式,讓容器自動將被調用者bean 注入給調用者bean。容器是通過調用者的bean 類的屬性名與配置文件的被調用者bean 的id 進行比較而實現自動注入的。
舉例:
(2)byType 方式自動注入
使用byType 方式自動注入,要求:配置文件中被調用者 bean 的class 屬性指定的類,要與代碼中調用者bean 類的某引用類型屬性類型同源。即要么相同,要么有 is-a 關系(子類,或是實現類)。但這樣的同源的被調用bean 只能有一個。多于一個,容器就不知該匹配哪一個了。
舉例:
為應用指定多個 Spring 配置文件
在實際應用里,隨著應用規(guī)模的增加,系統中Bean 數量也大量增加,導致配置文件變得非常龐大、臃腫。為了避免這種情況的產生,提高配置文件的可讀性與可維護性,可以將 Spring 配置文件分解成多個配置文件。
包含關系的配置文件:
多個配置文件中有一個總文件,總配置文件將各其它子文件通過<import/>引入。在Java 代碼中只需要使用總配置文件對容器進行初始化即可。
舉例:
代碼:
Spring 配置文件:
也可使用通配符*。但,此時要求父配置文件名不能滿足*所能匹配的格式,否則將出現循環(huán)遞歸包含。就本例而言,父配置文件不能匹配 spring-*.xml 的格式,即不能起名為spring-total.xml。
基于注解的 DI
舉例:di-annotation 項目
對于 DI 使用注解,將不再需要在 Spring 配置文件中聲明bean 實例。Spring 中使用注解,需要在原有 Spring 運行環(huán)境基礎上再做一些改變。
需要在 Spring 配置文件中配置組件掃描器,用于在指定的基本包中掃描注解。
指定多個包的三種方式:
1) 使用多個context:component-scan 指定不同的包路徑
2) 指定 base-package 的值使用分隔符
分隔符可以使用逗號(,)分號(;)還可以使用空格,不建議使用空格。
逗號分隔:
分號分隔:
3) base-package 是指定到父包名
base-package 的值表是基本包,容器啟動會掃描包及其子包中的注解,當然也會掃描到子包下級的子包。所以base-package 可以指定一個父包就可以。
或者最頂級的父包
但不建議使用頂級的父包,掃描的路徑比較多,導致容器啟動時間變慢。指定到目標包和合適的。也就是注解所在包全路徑。例如注解的類在com.bjpowernode.beans 包中
定義Bean 的注解@Component(掌握)
需要在類上使用注解@Component,該注解的value 屬性用于指定該bean 的 id 值。
舉例:di01
另外,Spring 還提供了 3 個創(chuàng)建對象的注解:
@Repository 用于對DAO 實現類進行注解
@Service 用于對Service 實現類進行注解
@Controller 用于對Controller 實現類進行注解
這三個注解與@Component 都可以創(chuàng)建對象,但這三個注解還有其他的含義,@Service 創(chuàng)建業(yè)務層對象,業(yè)務層對象可以加入事務功能, @Controller 注解創(chuàng)建的對象可以作為處理器接收用戶的請求。
@Repository,@Service,@Controller 是對@Component 注解的細化,標注不同層的對象。即持久層對象,業(yè)務層對象,控制層對象。
@Component 不指定value 屬性,bean 的 id 是類名的首字母小寫。
簡單類型屬性注入@Value(掌握)
需要在屬性上使用注解@Value,該注解的value 屬性用于指定要注入的值。
使用該注解完成屬性注入時,類中無需setter。當然,若屬性有setter, 則也可將其加到setter 上。
舉例:
byType 自動注入@Autowired(掌握)
需要在引用屬性上使用注解@Autowired,該注解默認使用按類型自動裝配Bean 的方式。
使用該注解完成屬性注入時,類中無需setter。當然若屬性有setter,則也可將其加到setter上。
舉例:
byName 自動注入@Autowired 與@Qualifier(掌握)
需要在引用屬性上聯合使用注解@Autowired 與@Qualifier。@Qualifier 的value 屬性用于指定要匹配的Bean 的id 值。類中無需set 方法,也可加到set 方法上。
舉例:
@Autowired 還有一個屬性required,默認值為true,表示當匹配失敗后,會終止程序運行。若將其值設置為false,則匹配失敗,將被忽略,未匹配的屬性值為null。
JDK 注解@Resource 自動注入(掌握)
Spring 提供了對jdk 中@Resource 注解的支持。@Resource 注解既可以按名稱匹配Bean,也可以按類型匹配Bean。默認是按名稱注入。使用該注 解,要求JDK 必須是 6 及以上版本。@Resource 可在屬性上,也可在set 方法上。
(1) byType 注入引用類型屬性
@Resource 注解若不帶任何參數,采用默認按名稱的方式注入,按名稱不能注入bean,則會按照類型進行Bean 的匹配注入。
舉例:
(2) byName 注入引用類型屬性
@Resource 注解指定其name 屬性,則name 的值即為按照名稱進行匹配的Bean 的 id。
舉例:
注解與 XML 的對比
注解優(yōu)點是:
方便
直觀
高效(代碼少,沒有配置文件的書寫那么復雜)。
其弊端也顯而易見:以硬編碼的方式寫入到Java 代碼中,修改是需要重新編譯代碼的。
XML 方式優(yōu)點是:
配置和代碼是分離的
在xml 中做修改,無需編譯代碼,只需重啟服務器即可將新的配置加載。xml 的缺點是:編寫麻煩,效率低,大型項目過于復雜。
以上Spring全套視頻|資料可私信/評論免費獲取~~~
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-10.29立即報名>> 2024德州儀器嵌入式技術創(chuàng)新發(fā)展研討會
-
10月31日立即下載>> 【限時免費下載】TE暖通空調系統高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月14日立即報名>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯網產業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市