Spring中的構(gòu)造注入
在上一篇文章中我們了解了DI的set注入,接下來我們來看一下DI實(shí)現(xiàn)的另一種方式,構(gòu)造注入。
構(gòu)造注入
構(gòu)造注入是指,在構(gòu)造調(diào)用者實(shí)例的同時(shí),完成被調(diào)用者的實(shí)例化。
即,使用構(gòu)造器設(shè)置依賴關(guān)系。
簡單的理解就是spring調(diào)用類的有參構(gòu)造方法,在創(chuàng)建對(duì)象的同時(shí)使用構(gòu)造方法給屬性賦值。
看一下構(gòu)造注入的實(shí)現(xiàn)
首先定義School類和Student類,在Student類中創(chuàng)建School類的對(duì)象。
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類:
public class Student { private String name; private int age; private School school; public Student() { System.out.println("Student的無參構(gòu)造方法"); } public Student(String myName, int myAge, School mySchool){ System.out.println("Student的有參構(gòu)造方法"); this.name = myName; this.age = myAge; this.school = mySchool; } 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的配置文件中聲明需要用到的對(duì)象
<!-- 構(gòu)造注入使用<constructor-arg>標(biāo)簽 一個(gè)<constructor-arg>標(biāo)簽表示構(gòu)造方法的一個(gè)參數(shù) <constructor-arg>標(biāo)簽屬性: name:表示構(gòu)造方法的形參名 index:表示構(gòu)造方法中參數(shù)的位置,自左向右從0開始 value:構(gòu)造方法的形參類型是簡單類型,使用value ref:構(gòu)造方法的形參類型是引用類型,使用ref 下面分別使用name和index來完成構(gòu)造注入 --> <!--使用name屬性--> <bean id="myStudent1" class="com.xxx.package01.Student"> <constructor-arg name="myName" value="張三" /> <constructor-arg name="myAge" value="20" /> <constructor-arg name="mySchool" ref="mySchool" /> </bean> <!--使用index屬性--> <bean id="myStudent2" class="com.xxx.package01.Student"> <constructor-arg index="0" value="張三" /> <constructor-arg index="1" value="20" /> <constructor-arg index="2" ref="mySchool" /> </bean> <bean id="mySchool" class="com.xxx.package01.School"> <property name="name" value="北京大學(xué)" /> <property name="address" value="北京" /> </bean>
準(zhǔn)備一個(gè)測試方法,測試以上程序
public class MyTest { @Test public void test01(){ String config = "package01/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); //使用myStudent1或myStudent2對(duì)象都能完成注入 Student myStudent = (Student) ac.getBean("myStudent1"); //Student myStudent = (Student) ac.getBean("myStudent2"); System.out.println("Student = " + myStudent); } }
測試結(jié)果如下:
從輸出結(jié)果我們可以看出,構(gòu)造注入在創(chuàng)建對(duì)象時(shí)調(diào)用的是Student的有參構(gòu)造方法,因?yàn)槲覀冊(cè)趕pring配置文件中聲明了兩次Student對(duì)象,所以會(huì)調(diào)用兩次有參構(gòu)造方法。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot如何配置Scheduler定時(shí)器
這篇文章主要介紹了Springboot如何配置Scheduler定時(shí)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03java 中 String format 和Math類實(shí)例詳解
這篇文章主要介紹了java 中 String format 和Math類實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06基于Java實(shí)現(xiàn)QQ郵箱發(fā)送工具類
我們?cè)谌粘i_發(fā)中,需要實(shí)現(xiàn)一個(gè)對(duì)郵箱的發(fā)送,今天就實(shí)現(xiàn)郵箱的發(fā)送工具類,只需要一些注冊(cè)郵箱之后的配置即可,感興趣的小伙伴可以了解下2023-12-12