方式: 配置<constructor-arg>元素
在Bean中不用写set方法,但是要有相应的构造器
特点:构造器注入有两种形式
1.根据参数类型,只限于数据类型不一致,当有多个相同的参数类型时,会出现匹配不正确的情况
2.根据参数位置的下标,出现多个相同的参数类型时使用
新建实体类
public class Student {
private long id;
private String name;
private int age;
//有参构造器
public Student(long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
System.out.println("有参构造器走了");
}
}
constructor.xml
形式一:根据参数类型
<?xml version="1.0" encoding="UTF-8"?>
<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
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 根据参数类型 如:type="long" -->
<bean name="s1" class="com.briup.bean.Student">
<constructor-arg type="long" value="1"></constructor-arg>
<constructor-arg type="String" value="tom"></constructor-arg>
<constructor-arg type="int" value="20"></constructor-arg>
</bean>
</beans>
测试类
@Test
public void ioc_constructor() {
try {
String path ="com/briup/ioc/constructor/constructor.xml";
ApplicationContext container = new ClassPathXmlApplicationContext(path);
Student stu = (Student) container.getBean("s1");
System.out.println(stu);
System.out.println(stu.getId());
System.out.println(stu.getName());
System.out.println(stu.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
总结:
当没有对应的有参构造器时,会出错
constructor.xml
形式二:根据参数下标
<?xml version="1.0" encoding="UTF-8"?>
<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
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 根据对应构造器参数的下标 如:index="1" -->
<bean name="s2" class="com.briup.bean.Student">
<constructor-arg index="1">
<value>科比</value>
</constructor-arg>
<constructor-arg index="0">
<value>1</value>
</constructor-arg>
<constructor-arg index="2">
<value>45</value>
</constructor-arg>
</bean>
</beans>
测试类
@Test
public void ioc_constructor() {
try {
String path ="com/briup/ioc/constructor/constructor.xml";
ApplicationContext container = new ClassPathXmlApplicationContext(path);
Student stu = (Student) container.getBean("s2");
System.out.println(stu);
System.out.println(stu.getId());
System.out.println(stu.getName());
System.out.println(stu.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}