目录
参考答案
任务描述
本关任务:分别使用设值注入和构造注入的方式装配 Person 实例。
相关知识
为了完成本关任务,你需要掌握如何使用基于 XML 的 Bean 装配。
基于 XML 的 Bean 装配简介
Spring 基于 XML 的装配通常有两种实现方式,一是设值注入,二是构造注入。 在 Spring 实例化 Bean 的过程中,首先会调用默认的构造方法实例化 Bean 对象,然后通过 Java 的反射机制调用 setXxx() 方法进行属性的注入。因此,设值注入要求一个 Bean 的对应类必须满足两个要求:一是提供一个无参构造方法;二是为需要注入的属性提供对应的 setter 方法。
使用设值注入时,在配置文件 applicationContext.xml 中需要使用 bean 元素的子元素 property 为每个属性注入值。
使用构造注入时,在配置文件中,需要使用 constructor-arg 标签定义构造方法的参数,可以使用其 value 属性设置该参数的值。
基于 XML 的 Bean 装配实例
创建 Student 类
创建一个 Spring 项目,在项目的 src 目录下,创建一个名称为 educoder 的包,在该包下创建一个 Student 类,如下所示。
package educoder;
public class Student {
// 属性值 name
private String name;
// 属性值 age
private int age;
// 无参构造方法
public Student() {
}
// 有参构造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
// 重写 tostring 方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// get 和 set 方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
上述代码中,定义了 name 和 age 两个属性,并为其提供了 getter 和 setter 方法,由于要使用构造注入,所以提供了有参的构造方法。为了能更清楚地看到输出结果,这里还重写了 toString() 方法。
创建 Spring 配置文件
在项目的 educoder 包下创建一个名为 applicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 使用设值注入方式装配 Student 实例 -->
<bean id="student1" class="educoder.Student">
<property name="name" value="张三" />
<property name="age" value="25" />
</bean>
<!-- 使用构造方法装配 Student 实例 -->
<bean id="student2" class="educoder.Student">
<constructor-arg index="0" value="李四" />
<constructor-arg index="1" value="24" />
</bean>
</beans>
上述代码中,首先使用了设值注入方式装配 Student 类的实例,其中 property 子元素用于调用 Bean 实例中的 setXxx() 方法完成属性赋值。然后使用了构造方式装配了 Student 类的实例,其中 constructor-arg 元素用于定义构造方法的参数,其属性 index 表示其索引(从 0 开始),value 属性用于设置注入的值。
创建测试类
在 educoder 包下创建一个名称为 MyTest 的测试类,编辑后如下所示。
package educoder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
String path="educoder/applicationContext.xml";
// 初始化Spring容器,加载配置文件,并对bean进行实例化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
// 设值方式输出结果
System.out.println(applicationContext.getBean("student1"));
// 构造方式输出结果
System.out.println(applicationContext.getBean("student2"));
}
}
执行结果:
Student{name='张三', age=25}
Student{name='李四', age=24}
从结果中可以看出,使用设值注入和构造注入两种方式都成功装配了 Student 实例。
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,分别使用设值注入和构造注入的方式装配 Bean,具体要求如下:
- Bean 实例为 Person 类,已知 Person 类的属性值为 name(姓名) 和 sex(性别),请在 Person.java 文件中补充该类;
- 在 applicationContext.xml 文件中分别使用设值注入和构造注入的方式装配 Person 实例,设值注入的属性值分别设置为---张三、男,bean 的 id 设置为 person1,构造注入的属性值分别设置为---李四、女,bean 的 id 设置为 person2。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
可在右侧 “测试结果”区查看具体的测试集详情。 测试输入: 无 预期输出:
Person{name='张三', sex='男'}
Person{name='李四', sex='女'}
开始你的任务吧,祝你成功!
参考答案
Person.java
package educoder;
public class Person {
// 属性值 name
private String name;
// 属性值 sex
private String sex;
// 请在此处编写代码
/********* Begin *********/
public Person() {
}
public Person(String name,String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
/********* End *********/
// 重写 toString 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
applicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 使用设值注入方式装配 Student 实例 -->
<bean id="person1" class="educoder.Person">
<property name="name" value="张三" />
<property name="sex" value="男" />
</bean>
<!-- 使用构造方法装配 Student 实例 -->
<bean id="person2" class="educoder.Person">
<constructor-arg index="0" value="李四" />
<constructor-arg index="1" value="女" />
</bean>
</beans>