Spring中的set注入方法
IoC控制反轉(zhuǎn)
控制反轉(zhuǎn)(IoC,Inversion of Control),是一個概念,是一種思想。指將傳統(tǒng)上由程序代碼直接操控的對象調(diào)用權(quán)交給容器,通過容器來實現(xiàn)對象的裝配和管理。
控制反轉(zhuǎn)就是對對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身反轉(zhuǎn)到了外部容器,通過容器實現(xiàn)對象的創(chuàng)建,屬性賦值,依賴的管理。IoC當前比較流行的實現(xiàn)方式是依賴注入(DI,Dependency Injection)
依賴注入DI
依賴注入DI是指程序運行過程中,若需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部容器,由外部容器創(chuàng)建后傳遞給程序。
Spring 的依賴注入對調(diào)用者與被調(diào)用者幾乎沒有任何要求,完全支持對象之間依賴關(guān)系的管理。
Spring 框架使用依賴注入(DI)實現(xiàn) IoC。
Spring 容器是一個超級大工廠,負責創(chuàng)建、管理所有的 Java 對象,這些 Java 對象被稱為 Bean。
Spring 容器管理著容器中 Bean 之間的依賴關(guān)系,Spring 使用“依賴注入”的方式來管理 Bean 之間的依賴關(guān)系。
使用 IoC 實現(xiàn)對象之間的解耦和。
Spring中DI的實現(xiàn)
Spring中DI的實現(xiàn)有兩種
1、在Spring配置文件中,使用標簽和屬性實現(xiàn)DI,稱為基于XML的DI。
2、使用Spring中的注解來實現(xiàn)DI,稱為基于注解的DI
基于XML的DI
bean 實例在調(diào)用無參構(gòu)造器創(chuàng)建對象后,就要對 bean 對象的屬性進行初始化。初始化是由容器自動完成的,稱為注入。根據(jù)注入方式的不同,常用的有兩類:set 注入、構(gòu)造注入。
set注入
set 注入也叫設(shè)值注入,是指通過 setter 方法傳入被調(diào)用者的實例。這種注入方式簡單、直觀,因而在 Spring 的依賴注入中大量使用。
根據(jù)屬性的數(shù)據(jù)類型的不同,set注入又可以分為簡單類型的set注入和引用類型的set注入。
簡單類型的set注入
Spring中規(guī)定基本數(shù)據(jù)類型和String類型都是簡單類型。
聲明一個Student類
public class Student { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
在Spring的配置文件中聲明需要添加到容器中的對象
<bean id="myStudent" class="com.xxx.package01.Student"> <!--id屬性是自定義的對象名稱,class屬性是類的全限定名稱--> <property name="name" value="zhangsan" /> <property name="age" value="20" /> <!--name是屬性名,value是屬性值--> </bean>
寫一個測試類來測試DI
@Test public void test01(){ String config = "package01/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); Student student = (Student) ac.getBean("myStudent"); System.out.println("Student = " + student); }
測試結(jié)果:
根據(jù)測試結(jié)果我們可以看出,spring通過DI將配置文件中聲明的屬性值成功賦給了容器中對象的屬性。
引用類型的set注入
在以上代碼的基礎(chǔ)上,我們添加另外一個School類
public class School { private String name; private String address; public void setName(String name) { this.name = name; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "School{" + "name='" + name + '\'' + ", address='" + address + '\'' + '}'; } }
修改Student類,Student類的屬性中包含了引用類型school
public class Student { private String name; private int age; private School school; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setSchool(School school) { this.school = school; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", school=" + school + '}'; } }
在spring配置文件中聲明Student對象和School對象
<!--聲明Student對象--> <bean id="myStudent" class="com.xxx.package02.Student"> <property name="name" value="zhangsan" /> <property name="age" value="20" /> <property name="school" ref="mySchool" /> <!--name="屬性名稱" ref="引用類型的bean的id"--> </bean> <!--聲明School對象--> <bean id="mySchool" class="com.xxx.package02.School"> <property name="name" value="北京大學(xué)" /> <property name="address" value="北京" /> </bean>
創(chuàng)建測試類
public class MyTest02 { @Test public void test01(){ String config = "package02/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); Student myStudent = (Student) ac.getBean("myStudent"); System.out.println("Student = " + myStudent); } }
測試結(jié)果:
引用類型還可以實現(xiàn)自動注入
對于引用類型屬性的注入,也可不在配置文件中顯示的注入??梢酝ㄟ^為標簽設(shè)置 autowire 屬性值,為引用類型屬性進行隱式自動注入(默認是不自動注入引用類型屬 性)。
根據(jù)自動注入判斷標準的不同,可以分為兩種:
- byName:根據(jù)名稱自動注入
- byType: 根據(jù)類型自動注入
byName方式自動注入
當配置文件中被調(diào)用者 bean 的 id 值與代碼中調(diào)用者 bean 類的屬性名相同時,可使用byName 方式,讓容器自動將被調(diào)用者 bean 注入給調(diào)用者 bean。
容器是通過調(diào)用者的 bean類的屬性名與配置文件的被調(diào)用者 bean 的 id 進行比較而實現(xiàn)自動注入的。
<!--聲明Student對象--> <bean id="myStudent" class="com.xxx.package03.Student" autowire="byName"> <property name="name" value="zhangsan" /> <property name="age" value="20" /> </bean> <!--聲明School對象--> <bean id="school" class="com.xxx.package03.School"> <property name="name" value="北京大學(xué)" /> <property name="address" value="北京" /> </bean>
byType方式自動注入
使用 byType 方式自動注入,要求:配置文件中被調(diào)用者 bean 的 class 屬性指定的類,要與代碼中調(diào)用者 bean 類的某引用類型屬性類型同源。
即要么相同,要么有 is-a 關(guān)系(子類,或是實現(xiàn)類)。
但這樣的同源的被調(diào)用 bean 只能有一個。多于一個,容器就不知該匹配哪一個了。
<!--聲明Student對象--> <bean id="myStudent" class="com.xxx.package03.Student" autowire="byType"> <property name="name" value="zhangsan" /> <property name="age" value="20" /> </bean> <!--聲明School對象--> <bean id="mySchool" class="com.xxx.package03.School"> <property name="name" value="北京大學(xué)" /> <property name="address" value="北京" /> </bean>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud網(wǎng)關(guān)組件Gateway原理深度解析
Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,一些基礎(chǔ)的請求預(yù)處理的邏輯可以統(tǒng)一實現(xiàn)在網(wǎng)關(guān)這一層,這樣業(yè)務(wù)服務(wù)只需要專注于處理業(yè)務(wù)邏輯即可,所以本文就帶大家深度解析網(wǎng)關(guān)組件Gateway,需要的朋友可以參考下2023-07-07SpringBoot多環(huán)境切換的靈活配置詳細教程
在真實項目開發(fā)的時候,一定會有多個環(huán)境,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多環(huán)境切換靈活配置的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04微信公眾號支付(二)實現(xiàn)統(tǒng)一下單接口
本篇文章主要給大家介紹調(diào)用微信公眾支付的統(tǒng)一下單API,通過參數(shù)封裝為xml格式并發(fā)送到微信給的接口地址就可以獲得返回內(nèi)容,需要的朋友可以參考下本文2015-09-09Spring中BeanFactory?FactoryBean和ObjectFactory的三種的區(qū)別
關(guān)于FactoryBean?和?BeanFactory的對比文章比較多,但是對ObjectFactory的描述就比較少,今天我們對比下這三種的區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-01-01使用Mybatis的Batch?Insert?Support?實現(xiàn)批量插入
這篇文章主要介紹了使用Mybatis的Batch?Insert?Support?實現(xiàn)批量插入。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07