您的“關注”和“點贊”,是信任,是認可,是支持,是動力......
目錄如意見相佐,可留言,
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新,
- 1 依賴注入概述
- 2 依賴注入的多種方式(Bean 的裝配方式)
- 2.1 基于 XML 的依賴注入
- 2.1.1 Setter Injection(設定方法注入)
- 2.1.2 Constructor Injection(構造器注入)
- 2.2 基于 Annotation(注解)的依賴注入
- 2.2.1 基于 Annotation(注解)的依賴注入概述
- 2.2.2 常用注解概述
- 2.3.3 案例實操,走起
- 2.3 基于自動裝配的依賴注入
- 2.4 靜態工廠注入
- 2.5 實體工廠注入
- 2.1 基于 XML 的依賴注入
- 【文章其他地址】
- 微信公眾號:碼農阿杰
- CSDN 博客
- 【參考資料】
- spring
- Artifact Repository Browser
- Apache Commons
1 依賴注入概述
依賴注入,英文叫做 Dependency Injection,簡稱 DI,
DI 和 IoC (《Spring IoC 容器詳解》)含義相同,它們是從兩個角度描述的同一個概念、做同一件事情,
當某個 Java 實體需要另一個 Java 實體時,使用 Spring 之前都是由呼叫者創建(使用 new 關鍵字獲得被呼叫者實體)被呼叫者的實體,而使用 Spring 框架后,被呼叫者的實體不再由呼叫者創建,而是由 Spring IoC 容器創建,這稱為控制反轉,也即 IoC,
Spring IoC 容器在創建被呼叫者的實體時,會自動將呼叫者需要的物件實體注入給呼叫者,這樣,呼叫者通過 Spring IoC 容器獲得被呼叫者實體,這稱為依賴注入,也即 DI,
Bean 的依賴注入方式,或叫 Bean 的裝配方式,有多種形式,比如接下來要介紹的基于 XML 的依賴注入(有兩種實作方式:Setter Injection 設定注入和 Constructor Injection 構造器注入)、基于 Annotation 的依賴注入、基于自動裝配、基于靜態工廠的方式的依賴注入和基于實體工廠的方式的依賴注入等,
2 依賴注入的多種方式(Bean 的裝配方式)
2.1 基于 XML 的依賴注入
2.1.1 Setter Injection(設定方法注入)
基于設定方法注入,也可以叫做setter方法注入,這是最簡單的注入方式,
指 IoC 容器使用 setter 方法注入被依賴的實體,通過呼叫無參構造器或無參 static 工廠方法實體化 bean 后,呼叫該 bean 的 setter 方法,即可實作基于 setter 的 DI,
案例實操,走你!
目的:在UserService介面的實作類UserServiceImpl中用setter方法初始化UserDao的物件,
具體步驟如下所示,
第一步:在com.manongajie.service包下創建UserService介面,如下圖所示:
第二步:在com.manongajie.serviceimpl包下創建介面UserService的實作類UserServiceImpl,在類中宣告userDao變數,但是沒有初始化它,這里就必須要 setter 方法(是 IoC 容器的注入入口,相當于 IoC 容器呼叫 setter 方法初始化 userDao 變數)了,如下圖所示:
第三步:在 applicationContext.xml組態檔中添加配置資訊,<property>標簽中的 name屬性值為setXxx()方法的引數(也叫依賴項);ref屬性值為 Bean 的name或id值,添加內容,如下圖所示:
第四步:撰寫測驗類并使用JUnit 測驗運行,在com.manongajie.test包下的SpringTest類中創建test2()方法,如下圖所示:
從上圖中可以看出,使用 Spring IoC 容器獲取 userService的實體后,呼叫了該實體的 addUser()方法,在該方法中又呼叫了 UserDao 介面的實作類 UserDaoImpl 中的 save()方法(userDao 物件就是 IoC 容器自動呼叫 setter 方法注入的,本例中 setter 方法為 setUserDao() 方法),
2.1.2 Constructor Injection(構造器注入)
指 IoC 容器使用構造方法注入被依賴的實體,基于構造器的 DI 通過呼叫帶引數的構造方法(本文本小節以帶引數的構造器進行介紹)實作,每個引數代表一個依賴,Spring 容器會根據 bean 中指定的構造方法引數來決定呼叫哪個建構式,
案例實操,走你!
目的:在UserDaoImpl類中創建成員變數userService,使用UserDaoImpl類的構造器注入userService 實體,也就是說 spring 容器在創建 UserDaoImpl類的實體時,也要將 userService實體作為構造器的引數值傳到UserDaoImpl類中(組態檔中操作,使用<constructor-arg>標簽,ref屬性表示 Bean 的 id),
具體步驟如下所示,
第一步:直接在之前的專案中操作,在UserDaoImpl類中創建一個成員變數userService,構造器UserService(UserService userService),如下圖所示:
第二步:配置組態檔,如下圖所示:
第三步:撰寫測驗類和JUnit 測驗運行,如下圖所示:
從上圖中可以看出,通過 Spring 容器獲取UserDao的實體后,呼叫了該實體的save()方法,在該方法中又呼叫了UserService介面的實作類UserServiceImpl中的addUser()方法(userService 物件就是 spring 容器通過構造器注入的,)
2.2 基于 Annotation(注解)的依賴注入
2.2.1 基于 Annotation(注解)的依賴注入概述
如果應用中 Bean 的數量較多,基于 XML 組態檔實作 Bean 的裝配會導致 XML 組態檔過于臃腫,從而給維護和升級帶來一定的困難,
基于 Annotation(注解)的依賴注入就可以解決這個問題,
2.2.2 常用注解概述
-
@Component
可以使用此注解描述 Spring 中的 Bean,但它是一個泛化的概念,僅僅表示一個組件(Bean),并且可以作用在任何層次,使用時只需將該注解標注在相應類上即可, -
@Repository
用于將資料訪問層(DAO層)的類標識為 Spring 中的 Bean,其功能與 @Component 相同, -
@Service
通常作用在業務層(Service 層),用于將業務層的類標識為 Spring 中的 Bean,其功能與 @Component 相同, -
@Controller
通常作用在控制層(如 Struts2 的 Action),用于將控制層的類標識為 Spring 中的 Bean,其功能與 @Component 相同, -
@Autowired(在本文 《2.3 基于自動裝配的依賴注入》 小節詳細介紹)
用于對 Bean 的屬性變數、屬性的 Set 方法及建構式進行標注,配合對應的注解處理器完成 Bean 的自動配置作業,默認按照 Bean 的型別進行裝配, -
@Resource
其作用與 Autowired 一樣,其區別在于 @Autowired 默認按照 Bean 型別裝配,而 @Resource 默認按照 Bean 實體名稱進行裝配,@Resource 中有兩個重要屬性:name 和 type,
Spring 將 name 屬性決議為 Bean 實體名稱,type 屬性決議為 Bean 實體型別,
如果指定 name 屬性,則按實體名稱進行裝配;
如果指定 type 屬性,則按 Bean 型別進行裝配,
如果都不指定,則先按 Bean 實體名稱裝配,如果不能匹配,則再按照 Bean 型別進行裝配;如果都無法匹配,則拋出NoSuchBeanDefinitionException例外, -
@Qualifier
與 @Autowired 注解配合使用,會將默認的按 Bean 型別裝配修改為按 Bean 的實體名稱裝配,Bean 的實體名稱由 @Qualifier 注解的引數指定,
2.3.3 案例實操,走起
第一步:匯入關鍵 JAR 包,然后創建 DAO 層介面,在com.manongajie.dao包下創建PersonDao介面,并添加add()方法,如下圖所示:
第二步:創建 DAO 層介面的實作類,在com.manongajie.daoimpl包下創建PersonDao介面的實作類PersonDaoImpl,并添加 DAO 層 add()方法,對類使用@Repository 注解將 PersonDaoImpl 類標識為 Spring 中的 Bean,其寫法相當于組態檔中 <bean id="personDao" /> 的書寫,如下圖所示:
第三步:創建 Service 層介面,圖下圖所示:
第四步:創建 Service 層介面的實作類,如下圖所示:
第五步:創建 Action 控制層,如下圖所示:
第六步:創建 Spring 組態檔,需要添加更多的約束檔案,如何把約束檔案交給 Eclipse 管理,請參見博文《開啟 Spring 之旅:第一個 Spring 程式 !》,
第七步:創建測驗類和 JUnit 運行測驗,如下圖所示:
從上圖中可以看出,DAO 層、Service 層和 Action 層的 add()方法都成功輸出了結果,
So,使用 Annotation 裝配 Bean 的方式已經成功實作了,
2.3 基于自動裝配的依賴注入
本文篇幅太長了,另寫一文,
請參見博文《Spring 基于自動裝配的依賴注入詳解》,
2.4 靜態工廠注入
需要提供一個靜態工廠方法 createBean(),創建 Bean 的實體(是指createBean()方法回傳哪個類的實體,就創建哪個類的實體),
需要在組態檔中,使用 <bean> 標簽的 factory-method 屬性,用于告訴 Spring 容器呼叫工廠類中的 createBean() 方法獲取 Bean 的實體,
案例演示,如下所示:
第一步:創建物體類 Person,在com.manongajie.static_factory包下創建,
第二步:創建靜態工廠類MyBeanFactory,并在類中創建createBean()靜態方法,用于創建 Bean 的實體,
第三步:創建組態檔,
第四步:創建測驗類和JUnit 測驗運行,
從以上運行結果可以看出,使用靜態工廠的方式也成功對 Bean 進行了實體化,
2.5 實體工廠注入
使用這種方式,工廠類不再使用靜態方法創建 Bean 的實體,而是直接在成員方法中創建 Bean 的實體,
也就是說需要一個成員方法createBean()來創建 Bean 的實體,
在組態檔中,需要實體化的 Bean 也不是通過 class 屬性直接指向其實體化的類,而是通過 factory-bean 屬性配置一個實體工廠,然后使用 factory-method 屬性確定使用工廠中的哪個方法,
案例演示,如下所示:
第一步:創建物體類 Person,并在類中添加say()方法,
第二步:創建實體工廠類,并添加成員方法createBean(),
第三步:創建組態檔,
第四步:創建測驗類和JUnit 測驗運行,
從以上運行結果可以看出,使用實體工廠的方式也是可以對 Bean 進行實體化的哦,,
【文章其他地址】
微信公眾號:碼農阿杰
CSDN 博客
【參考資料】
spring
Artifact Repository Browser
Apache Commons
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/186816.html
標籤:Java
上一篇:5G模組FM150-NA順利通過FCC/IC/PTCRB認證
下一篇:Spring 基于自動裝配的依賴注入詳解 [自動裝配模式搞不懂?來看就完了!!!][autowire 屬性值詳解][自動裝配的 6 種模式]
