深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用
概念:
依賴注入(Dependency Injection,DI)與控制反轉(zhuǎn)(IoC)的含義相同,只不過(guò)是從兩個(gè)角度描述的同一個(gè)概念。對(duì)于一個(gè)Spring初學(xué)者來(lái)說(shuō),這兩種稱呼都很難理解,我們通過(guò)簡(jiǎn)單的語(yǔ)言來(lái)描述這兩個(gè)概念。
使用對(duì)比
1. 使用前:
當(dāng)某個(gè)Java對(duì)象(調(diào)用者)需要調(diào)用另一個(gè)Java對(duì)象(被調(diào)用者,就是被依賴對(duì)象)時(shí),在傳統(tǒng)模式下,調(diào)用者通常會(huì)采用"new被調(diào)用者"的代碼方式來(lái)創(chuàng)建對(duì)象。這種方式會(huì)導(dǎo)致調(diào)用者與被調(diào)用者之間的耦合性增加,不利于后期項(xiàng)目的升級(jí)和維護(hù)。
2. 使用后:
在使用Spring框架后,對(duì)象的實(shí)例不再由調(diào)用者來(lái)創(chuàng)建,而是由Spring框架的容器來(lái)創(chuàng)建,它會(huì)負(fù)責(zé)控制程序之間的關(guān)系,而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由應(yīng)用代碼轉(zhuǎn)移到Spring框架容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring框架的控制反轉(zhuǎn)。
從Spring框架容器的角度來(lái)看,它負(fù)責(zé)將被依賴對(duì)象賦值給調(diào)用者的成員變量,相當(dāng)于調(diào)用者注入了其依賴實(shí)例,這就是Spring框架的依賴注入。
理解控制反轉(zhuǎn)(Ioc):
控制反轉(zhuǎn)也稱為依賴注入,是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)理念,用來(lái)降低程序代碼間的耦合度,在MVC的設(shè)計(jì)模式中經(jīng)常使用。首先考慮什么是依賴。依賴在代碼中一般指通過(guò)局部變量、方法參數(shù)、返回值等建立的對(duì)于其他對(duì)象的調(diào)用關(guān)系。例如,在A類的方法中,實(shí)例化了B類的對(duì)象并調(diào)用其方法以完成特定的功能,即A類依賴于B類。
幾乎所有應(yīng)用都由兩個(gè)或更多的類,通過(guò)彼此合作來(lái)實(shí)現(xiàn)完整功能的。類與類之間的依賴關(guān)系增加了程序開發(fā)的復(fù)雜程度,在開發(fā)一個(gè)類的時(shí)候,還要考慮對(duì)正在使用該類的其他類的影響。如常見的業(yè)務(wù)層調(diào)用數(shù)據(jù)訪問(wèn)層實(shí)現(xiàn)持久化操作,解決問(wèn)題的步驟如下:
(1)獲取Spring開發(fā)包并為工程添加Spring框架支持
(2)為業(yè)務(wù)層和數(shù)據(jù)訪問(wèn)層接口,聲明所需要的方法
(3)編寫數(shù)據(jù)訪問(wèn)層接口UserDao的實(shí)現(xiàn)類,完成具體的持久化操作
(4)在業(yè)務(wù)實(shí)現(xiàn)類中聲明UserDao接口類型的屬性,并添加適當(dāng)?shù)臉?gòu)造方法為屬性賦值
(5)在Spring的配置文件中,將DAO對(duì)象以構(gòu)造注入的方式賦值給業(yè)務(wù)實(shí)例的UserDao類型屬性
(6)在代碼中獲取Spring配置文件裝配好的業(yè)務(wù)類對(duì)象,實(shí)現(xiàn)程序功能
IoC的應(yīng)用方法
IoC容器中配置屬性的語(yǔ)法
第一種方式:
Book.java
package cn.spring.ioc.demo.exercise; public class Book { private Integer id; private String bookName; private Float price; public Integer getId() { return id; } public String getBookName() { return bookName; } public Float getPrice() { return price; } public void setId(Integer id) { this.id = id; } public void setBookName(String bookName) { this.bookName = bookName; } public void setPrice(Float price) { this.price = price; } @Override public String toString() { return "Book{" + "id=" + id + ", bookName='" + bookName + '\'' + ", price=" + price + '}'; } }
容器配置:
<bean id="book1" class="cn.spring.ioc.demo.exercise.Book"> <property name="id" value="1001"/> <property name="bookName" value="C++基礎(chǔ)編程"/> <property name="price" value="28.2"/> </bean>
第二種方式:
Book_1.java
package cn.spring.ioc.demo.exercise; public class Book_1 { private Integer id; private String bookName; private Float price; public Book_1(Integer id,String bookName,Float price){ this.id = id; this.bookName = bookName; this.price = price; } public Integer getId() { return id; } public String getBookName() { return bookName; } public Float getPrice() { return price; } public void setId(Integer id) { this.id = id; } public void setBookName(String bookName) { this.bookName = bookName; } public void setPrice(Float price) { this.price = price; } @Override public String toString() { return "Book_1{" + "id=" + id + ", bookName='" + bookName + '\'' + ", price=" + price + '}'; } }
容器配置:
<bean id="book2" class="cn.spring.ioc.demo.exercise.Book_1"> <constructor-arg index="0" value="1002"/> <constructor-arg index="1" value="Java/> <constructor-arg index="2" value="33.3"/> </bean>
第三種方式:
BookFactory.java
package cn.spring.ioc.demo.exercise; public class BookFactory { public Book getBookInstance(Book book){ return book; } }
容器配置:
<bean id="book3" class="cn.spring.ioc.demo.exercise.Book"> <property name="id" value="1004"/> <property name="bookName" value="go"/> <property name="price" value="88.2"/> </bean> <bean id="factory" class="cn.spring.ioc.demo.exercise.BookFactory" /> <bean id="finstance" factory-bean="factory" factory-method="getBookInstance"> <constructor-arg index="0" ref="book3"/> </bean>
第四種方式:
Book_1Factory.java
package cn.spring.ioc.demo.exercise; public class Book_1Factory { public static Book_1 getBookInstance(Integer id,String bookName,Float price){ return new Book_1(id, bookName, price); } }
容器配置:
<bean id="bf" class="cn.spring.ioc.demo.exercise.Book_1Factory" factory-method="getBookInstance"> <constructor-arg index="0" value="1003"/> <constructor-arg index="1" value="python"/> <constructor-arg index="2" value="99.9"/> </bean>
到此這篇關(guān)于深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用的文章就介紹到這了,更多相關(guān)Spring框架 依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入Java7的一些新特性以及對(duì)腳本語(yǔ)言支持API的介紹
本篇文章是對(duì)Java7的一些新特性以及對(duì)腳本語(yǔ)言支持API的概述,需要的朋友參考下2013-05-05Java8中的LocalDateTime和Date一些時(shí)間操作方法
這篇文章主要介紹了Java8中的LocalDateTime和Date一些時(shí)間操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Mybatis實(shí)現(xiàn)自定義的typehandler三步曲
這篇文章主要介紹了Mybatis實(shí)現(xiàn)自定義的typehandler三步曲的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07

springboot集成es插入和查詢的簡(jiǎn)單使用示例詳解

在Java中將List轉(zhuǎn)換為String輸出過(guò)程解析

Java使用Jsoup解析html網(wǎng)頁(yè)的實(shí)現(xiàn)步驟