spring中的DI步驟詳解
【知識要點】
- 控制反轉(zhuǎn)(IOC)將對象的創(chuàng)建權(quán)限交給第三方模塊完成,第三方模塊需要將創(chuàng)建好的對象,以某種合適的方式交給引用對象去使用,這個過程稱為依賴注入(DI)。如:A對象如果需要使用B對象的方法,則A類依賴B類。
- 對象裝配是在對象構(gòu)造過程中,對其屬性進(jìn)行初始化。對象的屬性分為簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型,簡單數(shù)據(jù)類型通常指String、List、map等由高級語言提供的數(shù)據(jù)類型,復(fù)雜數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型或第三方的數(shù)據(jù)類型,對象的裝配主要指對復(fù)雜數(shù)據(jù)類型的依賴注入(DI)。
【實驗?zāi)康摹?/h2>
了解基于xml的裝配技術(shù)
熟悉基于注解的裝配技術(shù)
掌握使用注解符@Autowired和@Resource的使用
【實驗內(nèi)容】
定義學(xué)生類(Student)、課程類(Course)、班主任(ClassTeacher),學(xué)生類Student中有姓名、課程集合和班主任三個屬性,對學(xué)生對象進(jìn)行裝配。
基于xml的設(shè)值注入
基于xml的構(gòu)造注入
基于注解的裝配
基于自動裝配
【實驗步驟】
一. 實驗環(huán)境搭建
- 標(biāo)準(zhǔn)的spring控制臺程序spring-assemble-demo5
- 在源代碼com.bjwl.service包中增加Student、Course、ClassTeacher三個類,具體代碼如下所示。
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è)置注入類中必須有對應(yīng)的setter方法和無參構(gòu)造函數(shù),對類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ù)庫原理"></property> </bean> </list> </property> </bean> </beans>
在配置文件中property對應(yīng)對象的屬性, value對應(yīng)簡單數(shù)據(jù)類型的屬性值;當(dāng)屬性值是由spring管理的對象時使用ref引用屬性值,當(dāng)使用list、map等類型時,需要進(jìn)一步描述數(shù)據(jù)類型等信息。
- 編寫測試程序,在com.bjwl.service包中添加AssembleTest,定義測試方法,代碼如下所示。
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()); } }
運行測試程序,結(jié)果如下所示
2. 基于xml的構(gòu)造注入
- 1.使用構(gòu)造注入裝配時,類中必須包含帶參構(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ù)庫原理"></constructor-arg> </bean> </list> </constructor-arg > </bean>
代碼中constructor-arg標(biāo)簽為構(gòu)造注入標(biāo)簽,constructor-arg中index是參數(shù)的索引,value對應(yīng)簡單數(shù)據(jù)類型的屬性值;當(dāng)屬性值是由spring管理的對象時使用ref引用屬性值。注意:在正式開發(fā)中通常使用constructor-arg標(biāo)簽中使用name屬性,而不是index屬性,因為name對應(yīng)構(gòu)造函數(shù)的行參名,更加準(zhǔn)確。
- 3.在測類中增加constructorTest測試方法,代碼如下所示。
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()); } }
運行測試程序,結(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 ,代表這個類創(chuàng)建的對象交給spring進(jìn)行管理,在屬性上的@Value注解符,代表簡單數(shù)據(jù)類型屬性注入,@Autowired代表對象的注入。對于list、map的注入還要借助xml完成,如:課程集合的注入。
注意:對象注入時,使用@Autowired注解符是spring提供的,注入依據(jù)數(shù)據(jù)類型(byType),如:classTeacher屬性注入,是spring在對象池中尋找類型為Teacher的對象,然后進(jìn)行匹配,如果系統(tǒng)中存在兩個或兩個以上類型為Teacher的對象,需要借助另外一個注解符@Qualifier完成;另外JDK還提供了一個注解符@Resource,也可以完成依賴注入,注入依據(jù)對象的名稱(byName),上例中需要在對象池中尋找名稱為classTeacher的對象進(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ù)庫原理"></property> </bean> </util:list> </beans>
代碼的第3、7、8行引入context的頭部文件,第12行開啟注解注解Bean裝配,第13行聲明組件掃描位置
- 3. 編寫測試程序,在測試類中增加AnnotationTest 方法,代碼如下所示。
public void setterTest(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-annotation.xml"); Student student = (Student)context.getBean("student"); System.out.println(student.toString()); }
運行測試程序,測試結(jié)果如下
自動裝配技術(shù)
- 1.使用自動裝配需要指定的屬性需要有setter方法。自動裝配技術(shù)可以依賴使用xml方式和注解方式對bean的管理,在此僅演示使用注解方式的自動裝配,簡單數(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.自動裝配依據(jù)配置文件中bean標(biāo)簽的autowire屬性完成自動裝配規(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,通過屬性的名稱實現(xiàn)自動裝配,此時要求student的classTeacher屬性名必須 bean所對應(yīng)的名稱完全一致,default-autowire屬性值也可以是為byType,通過屬性的類型實現(xiàn)自動裝配。此種裝配方式簡單,但是缺乏靈活度,開發(fā)時幾乎不用。
- 3.編寫測試程序,在測試類中增加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()); } }
運行測試程序,執(zhí)行結(jié)果如下圖所示
小結(jié)
本節(jié)主要介紹了bean的裝配實現(xiàn)過程,通常對于簡單數(shù)據(jù)類型數(shù)據(jù)初始主要在獲得對象后,使用setter方法完成,所謂的裝配主要是復(fù)雜數(shù)據(jù)類型的依賴注入。Bean的裝配可以基于xml配置、注解、自動化裝配三種方式,當(dāng)前主流的使用基于注解的裝配,基于xml配置輔助,自動化裝配技術(shù)幾乎不用。在基于注解的配置中,特別注意注解符@Autowired和@Resource匹配規(guī)則及使用byType時,@Qualifier使用場景和原因。
到此這篇關(guān)于spring中的DI步驟詳解的文章就介紹到這了,更多相關(guān)spring中DI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis 查詢sql中in條件用法詳解(foreach)
這篇文章主要介紹了mybatis 查詢sql中in條件用法詳解(foreach),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java中用Mybatis插入mysql報主鍵重復(fù)的解決方案
這篇文章主要介紹了Java中用Mybatis插入mysql報主鍵重復(fù)的解決方案,具有很好的參考價值,希望對大家有所幫助。2023-02-02如何在java 8 stream表達(dá)式實現(xiàn)if/else邏輯
這篇文章主要介紹了如何在java 8 stream表達(dá)式實現(xiàn)if/else邏輯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Springboot事件監(jiān)聽與@Async注解詳解
這篇文章主要介紹了Springboot事件監(jiān)聽與@Async注解詳解,在開發(fā)中經(jīng)??梢岳肧pring事件監(jiān)聽來實現(xiàn)觀察者模式,進(jìn)行一些非事務(wù)性的操作,如記錄日志之類的,需要的朋友可以參考下2024-01-01Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例
這篇文章主要介紹了Java將CSV的數(shù)據(jù)發(fā)送到kafka得示例,幫助大家更好得理解和使用Java,感興趣的朋友可以了解下2020-11-11