spring中的DI步驟詳解
【知識(shí)要點(diǎn)】
- 控制反轉(zhuǎn)(IOC)將對(duì)象的創(chuàng)建權(quán)限交給第三方模塊完成,第三方模塊需要將創(chuàng)建好的對(duì)象,以某種合適的方式交給引用對(duì)象去使用,這個(gè)過(guò)程稱為依賴注入(DI)。如:A對(duì)象如果需要使用B對(duì)象的方法,則A類依賴B類。
- 對(duì)象裝配是在對(duì)象構(gòu)造過(guò)程中,對(duì)其屬性進(jìn)行初始化。對(duì)象的屬性分為簡(jiǎn)單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型,簡(jiǎn)單數(shù)據(jù)類型通常指String、List、map等由高級(jí)語(yǔ)言提供的數(shù)據(jù)類型,復(fù)雜數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型或第三方的數(shù)據(jù)類型,對(duì)象的裝配主要指對(duì)復(fù)雜數(shù)據(jù)類型的依賴注入(DI)。
【實(shí)驗(yàn)?zāi)康摹?/h2>
了解基于xml的裝配技術(shù)
熟悉基于注解的裝配技術(shù)
掌握使用注解符@Autowired和@Resource的使用
【實(shí)驗(yàn)內(nèi)容】
定義學(xué)生類(Student)、課程類(Course)、班主任(ClassTeacher),學(xué)生類Student中有姓名、課程集合和班主任三個(gè)屬性,對(duì)學(xué)生對(duì)象進(jìn)行裝配。
基于xml的設(shè)值注入
基于xml的構(gòu)造注入
基于注解的裝配
基于自動(dòng)裝配
【實(shí)驗(yàn)步驟】
一. 實(shí)驗(yàn)環(huán)境搭建
- 標(biāo)準(zhǔn)的spring控制臺(tái)程序spring-assemble-demo5
- 在源代碼com.bjwl.service包中增加Student、Course、ClassTeacher三個(gè)類,具體代碼如下所示。
public class Student {
private String sname;
private Integer sage;
private List<Course> courses;
private Teacher classTeacher;
}
public class Course {
private String courseName;
}
public class Teacher {
private String tname;
}1. 基于xml的設(shè)值注入
- 設(shè)置注入類中必須有對(duì)應(yīng)的setter方法和無(wú)參構(gòu)造函數(shù),對(duì)類Student中的代碼改造如下所示。
public class Student {
private String sname;
private Integer sage;
private List<Course> courses;
private Teacher classTeacher;
public void setSname(String sname) {
this.sname = sname;
}
public void setSage(Integer sage) {
this.sage = sage;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
public void setClassTeacher(Teacher classTeacher) {
this.classTeacher = classTeacher;
}
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
", sage=" + sage +
", courses=" + courses +
", classTeacher=" + classTeacher +
'}';
}
} 類Course 和Teacher 按照上述代碼添加setter方法,在此不再贅述。
- 2. 在resources目錄下添加spring配置文件spring-assemble-set.xml,代碼如下所示。
<beans>
<!--基于屬性注入(設(shè)置注入)的bean裝配-->
<bean id="teacher" class="com.bjwl.service.setter.Teacher">
<property name="tname" value="李老師"></property>
</bean>
<bean id="student" class="com.bjwl.service.setter.Student">
<property name="sname" value="張三"></property>
<property name="sage" value="18"></property>
<property name="classTeacher" ref="teacher"></property>
<property name="courses">
<list value-type="com.bjwl.service.setter.Course">
<bean class="com.bjwl.service.setter.Course">
<property name="courseName" value="數(shù)據(jù)結(jié)構(gòu)"></property>
</bean>
<bean class="com.bjwl.service.setter.Course">
<property name="courseName" value="數(shù)據(jù)庫(kù)原理"></property>
</bean>
</list>
</property>
</bean>
</beans> 在配置文件中property對(duì)應(yīng)對(duì)象的屬性, value對(duì)應(yīng)簡(jiǎn)單數(shù)據(jù)類型的屬性值;當(dāng)屬性值是由spring管理的對(duì)象時(shí)使用ref引用屬性值,當(dāng)使用list、map等類型時(shí),需要進(jìn)一步描述數(shù)據(jù)類型等信息。
- 編寫測(cè)試程序,在com.bjwl.service包中添加AssembleTest,定義測(cè)試方法,代碼如下所示。
public class AssembleTest {
@Test
public void setterTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-assemble-set.xml");
Student student = (Student)context.getBean("student");
System.out.println(student.toString());
}
}運(yùn)行測(cè)試程序,結(jié)果如下所示

2. 基于xml的構(gòu)造注入
- 1.使用構(gòu)造注入裝配時(shí),類中必須包含帶參構(gòu)造函數(shù),學(xué)生類修改后代碼如下所示。
public class Student {
private String sname;
private Integer sage;
private List<Course> courses;
private Teacher classTeacher;
public Student(String sname, Integer sage, List<Course> courses, Teacher classTeacher) {
this.sname = sname;
this.sage = sage;
this.courses = courses;
this.classTeacher = classTeacher;
}
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
", sage=" + sage +
", courses=" + courses +
", classTeacher=" + classTeacher +
'}';
}
}類Course 和Teacher 按照上述代碼添加setter方法,在此不再贅述。
- 2. 在resources目錄下添加spring配置文件spring-constructor.xml,代碼如下所示。
<beans>
<bean id="teacher" class="com.bjwl.service.constructor.Teacher">
<constructor-arg index="0" value="張三"></constructor-arg>
</bean>
<bean id="student" class="com.bjwl.service.constructor.Student">
<constructor-arg index="0" value="張三"></constructor-arg>
<constructor-arg index="1" value="18"></constructor-arg>
<constructor-arg index="3" ref="teacher"></constructor-arg>
<constructor-arg index="2">
<list value-type="com.bjwl.service.constructor.Course">
<bean class="com.bjwl.service.constructor.Course">
<constructor-arg name="courseName" value="數(shù)據(jù)結(jié)構(gòu)"></constructor-arg>
</bean>
<bean class="com.bjwl.service.constructor.Course">
<constructor-arg name="courseName" value="數(shù)據(jù)庫(kù)原理"></constructor-arg>
</bean>
</list>
</constructor-arg >
</bean> 代碼中constructor-arg標(biāo)簽為構(gòu)造注入標(biāo)簽,constructor-arg中index是參數(shù)的索引,value對(duì)應(yīng)簡(jiǎn)單數(shù)據(jù)類型的屬性值;當(dāng)屬性值是由spring管理的對(duì)象時(shí)使用ref引用屬性值。注意:在正式開(kāi)發(fā)中通常使用constructor-arg標(biāo)簽中使用name屬性,而不是index屬性,因?yàn)閚ame對(duì)應(yīng)構(gòu)造函數(shù)的行參名,更加準(zhǔn)確。
- 3.在測(cè)類中增加constructorTest測(cè)試方法,代碼如下所示。
public class AssembleTest {
@Test
public void constructorTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-constructor.xml");
Student student = context.getBean("student",Student.class);
System.out.println(student.toString());
}
} 運(yùn)行測(cè)試程序,結(jié)果如下所示。

3. 基于注解的裝配
- 1.基于注解的裝配,需要在代碼的屬性上使用注解符,Student的代碼修改如下所示。
@Component
public class Student {
@Value("張三")
private String sname;
@Value("18")
private Integer sage;
@Value("#{courses}")
private List<Course> courses;
@Autowired
private Teacher classTeacher;
}
@Component
public class Teacher {
@Value("李老師")
private String tname;
}
@Component
public class Course {
public void setCourseName(String courseName) {
this.courseName = courseName;
}
private String courseName;
} 代碼中在類上添加的注解符@Component ,代表這個(gè)類創(chuàng)建的對(duì)象交給spring進(jìn)行管理,在屬性上的@Value注解符,代表簡(jiǎn)單數(shù)據(jù)類型屬性注入,@Autowired代表對(duì)象的注入。對(duì)于list、map的注入還要借助xml完成,如:課程集合的注入。
注意:對(duì)象注入時(shí),使用@Autowired注解符是spring提供的,注入依據(jù)數(shù)據(jù)類型(byType),如:classTeacher屬性注入,是spring在對(duì)象池中尋找類型為Teacher的對(duì)象,然后進(jìn)行匹配,如果系統(tǒng)中存在兩個(gè)或兩個(gè)以上類型為Teacher的對(duì)象,需要借助另外一個(gè)注解符@Qualifier完成;另外JDK還提供了一個(gè)注解符@Resource,也可以完成依賴注入,注入依據(jù)對(duì)象的名稱(byName),上例中需要在對(duì)象池中尋找名稱為classTeacher的對(duì)象進(jìn)行注入。
- 1.在resources目錄下添加spring配置文件spring-annotation.xml,代碼如下所示
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:annotation-config />
<context:component-scan base-package="com.bjwl.service.annotation" />
<util:list id="courses">
<bean id="course1" class="com.bjwl.service.annotation.Course" >
<property name="courseName" value="數(shù)據(jù)結(jié)構(gòu)"></property>
</bean>
<bean id="course2" class="com.bjwl.service.annotation.Course" >
<property name="courseName" value="數(shù)據(jù)庫(kù)原理"></property>
</bean>
</util:list>
</beans> 代碼的第3、7、8行引入context的頭部文件,第12行開(kāi)啟注解注解Bean裝配,第13行聲明組件掃描位置
- 3. 編寫測(cè)試程序,在測(cè)試類中增加AnnotationTest 方法,代碼如下所示。
public void setterTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-annotation.xml");
Student student = (Student)context.getBean("student");
System.out.println(student.toString());
} 運(yùn)行測(cè)試程序,測(cè)試結(jié)果如下

自動(dòng)裝配技術(shù)
- 1.使用自動(dòng)裝配需要指定的屬性需要有setter方法。自動(dòng)裝配技術(shù)可以依賴使用xml方式和注解方式對(duì)bean的管理,在此僅演示使用注解方式的自動(dòng)裝配,簡(jiǎn)單數(shù)據(jù)類型使用注解的方式完成,主要演示班主任(classTeacher)的注入,修改student類,代碼如下所示。
public class Student {
@Value("李四")
private String sname;
@Value("18")
private Integer sage;
private Teacher classTeacher;
public void setSname(String sname) {
this.sname = sname;
}
public void setSage(Integer sage) {
this.sage = sage;
}
public void setClassTeacher(Teacher classTeacher) {
this.classTeacher = classTeacher;
}
@Override
public String toString() {
//省略
}
}
@Component("classTeacher")
public class Teacher {
@Override
public String toString() {
//省略
}
@Value("zhangsan")
private String tname;
} 2.自動(dòng)裝配依據(jù)配置文件中bean標(biāo)簽的autowire屬性完成自動(dòng)裝配規(guī)則的定義,在resources目錄下添加spring配置文件spring-auto.xml,配置文件代碼如下。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName">
<context:annotation-config />
<context:component-scan base-package="com.bjwl.service.auto" />
</beans> 代碼第7行beans 指定default-autowire屬性的值為byName,通過(guò)屬性的名稱實(shí)現(xiàn)自動(dòng)裝配,此時(shí)要求student的classTeacher屬性名必須 bean所對(duì)應(yīng)的名稱完全一致,default-autowire屬性值也可以是為byType,通過(guò)屬性的類型實(shí)現(xiàn)自動(dòng)裝配。此種裝配方式簡(jiǎn)單,但是缺乏靈活度,開(kāi)發(fā)時(shí)幾乎不用。
- 3.編寫測(cè)試程序,在測(cè)試類中增加AutoTest 方法,代碼如下所示。
public class AutoTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-auto.xml");
Student student = context.getBean("student", Student.class);
System.out.println(student.toString());
}
}運(yùn)行測(cè)試程序,執(zhí)行結(jié)果如下圖所示

小結(jié)
本節(jié)主要介紹了bean的裝配實(shí)現(xiàn)過(guò)程,通常對(duì)于簡(jiǎn)單數(shù)據(jù)類型數(shù)據(jù)初始主要在獲得對(duì)象后,使用setter方法完成,所謂的裝配主要是復(fù)雜數(shù)據(jù)類型的依賴注入。Bean的裝配可以基于xml配置、注解、自動(dòng)化裝配三種方式,當(dāng)前主流的使用基于注解的裝配,基于xml配置輔助,自動(dòng)化裝配技術(shù)幾乎不用。在基于注解的配置中,特別注意注解符@Autowired和@Resource匹配規(guī)則及使用byType時(shí),@Qualifier使用場(chǎng)景和原因。
到此這篇關(guān)于spring中的DI步驟詳解的文章就介紹到這了,更多相關(guān)spring中DI內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用多線程模擬銀行系統(tǒng)存錢問(wèn)題
本文將利用Java多線程模擬銀行系統(tǒng)存錢問(wèn)題:使用兩個(gè)不同的線程向同一個(gè)賬戶存錢。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
Java URL自定義私有網(wǎng)絡(luò)協(xié)議
URI與URL的區(qū)別 一.先來(lái)序言一段 二.協(xié)議的自定義的理解 三.自定義協(xié)議與URL的關(guān)系 四.URL自定義私有協(xié)議實(shí)戰(zhàn) 五.后話,自定義mineType解析器2016-04-04
淺談緩沖字符流 BufferedReader BufferedWriter用法
這篇文章主要介紹了緩沖字符流 BufferedReader BufferedWriter的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
MyBatis?Plus?導(dǎo)入IdType失敗的解決
這篇文章主要介紹了MyBatis?Plus?導(dǎo)入IdType失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
解決Java中由于數(shù)據(jù)太大自動(dòng)轉(zhuǎn)換成科學(xué)計(jì)數(shù)法的問(wèn)題
今天小編就為大家分享一篇解決Java中由于數(shù)據(jù)太大自動(dòng)轉(zhuǎn)換成科學(xué)計(jì)數(shù)法的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
openfeign使用nacos服務(wù)注冊(cè)方式調(diào)用的實(shí)現(xiàn)
文章說(shuō)明如何將項(xiàng)目注冊(cè)到Nacos,使OpenFeign調(diào)用時(shí)通過(guò)服務(wù)名自動(dòng)發(fā)現(xiàn)服務(wù),無(wú)需手動(dòng)配置URL,需添加Nacos和Sentinel依賴,啟動(dòng)類使用@FeignClient注解并指定fallback,服務(wù)名稱直接填入value屬性即可實(shí)現(xiàn)動(dòng)態(tài)調(diào)用2025-09-09
mybatis?collection和association的區(qū)別解析
這篇文章主要介紹了mybatis?collection解析以及和association的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

