Spring中的构造注入
作者:举个栗子?
这篇文章主要介绍了Spring中的构造注入,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
在上一篇文章中我们了解了DI的set注入,接下来我们来看一下DI实现的另一种方式,构造注入。
构造注入
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。
即,使用构造器设置依赖关系。
简单的理解就是spring调用类的有参构造方法,在创建对象的同时使用构造方法给属性赋值。
看一下构造注入的实现
首先定义School类和Student类,在Student类中创建School类的对象。
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的无参构造方法"); } public Student(String myName, int myAge, School mySchool){ System.out.println("Student的有参构造方法"); 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的配置文件中声明需要用到的对象
<!-- 构造注入使用<constructor-arg>标签 一个<constructor-arg>标签表示构造方法的一个参数 <constructor-arg>标签属性: name:表示构造方法的形参名 index:表示构造方法中参数的位置,自左向右从0开始 value:构造方法的形参类型是简单类型,使用value ref:构造方法的形参类型是引用类型,使用ref 下面分别使用name和index来完成构造注入 --> <!--使用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="北京大学" /> <property name="address" value="北京" /> </bean>
准备一个测试方法,测试以上程序
public class MyTest { @Test public void test01(){ String config = "package01/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); //使用myStudent1或myStudent2对象都能完成注入 Student myStudent = (Student) ac.getBean("myStudent1"); //Student myStudent = (Student) ac.getBean("myStudent2"); System.out.println("Student = " + myStudent); } }
测试结果如下:
从输出结果我们可以看出,构造注入在创建对象时调用的是Student的有参构造方法,因为我们在spring配置文件中声明了两次Student对象,所以会调用两次有参构造方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。