- 根据Spring框架中构造方法中参数类型的不同,调用的方法也不同。
- 概要:通过constructor-arg标签设置构造方法参数值
- 前提:搭建环境
- 构建Spring框架,引如下六个包:
commons-logging-1.2.jar
spring-beans-4.3.10.RELEASE.jar
spring-context-4.3.10.RELEASE.jar
spring-core-4.3.10.RELEASE.jar
spring-expression-4.3.10.RELEASE.jar
- 创建一个application.xml,再创建一个普通类和测试类Test
基本数据类型或String类型
总结:如果参数类型为基本参数类型或String类型,则直接使用value标签属性赋值
public class Students {
private int age;
private String name;
public Students(int age, String name) {
this.age = age;
this.name = name;
//局部范围内的局部变量名(与全局变量名相同的)覆盖全局变量,通过this调用全局变量
System.out.println("基本数据类型");
}
@Override
public String toString() {
return "age=" + age + ", name=" + name;
}
}
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");//创建容器并创建类将其加到此容器中
Students student = applicationContext.getBean(Students.class);//加载类并创建对象获取信息
System.out.println(student);
}
}
<bean class="com.jd.vo.Students">
<constructor-arg name="name" value="Jhon"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
输出结果:
基本数据类型
age=18, name=Jhon
引用数据类型
总结:如果参数类型是引用数据类型,则用ref标签属性指定对象
import java.util.Date;
public class Students {
private Date birthday;
public Students(Date birthday) {
this.birthday = birthday;
System.out.println("引用数据类型");
}
}
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
System.out.println(applicationContext.getBean("date"));
}
}
<bean id="date" class="java.util.Date"/>
<bean class="com.jd.vo.Students">
<constructor-arg name="birthday" ref="date"></constructor-arg>
</bean>
输出结果:
引用数据类型
Thu May 09 23:09:23 CST 2019
数组类型
总结:如果参数类型是数组类型,则用子标签array中的value标签属性设定值
public class Students {
private int [] scores;
public Students(int [] scores) {
this.scores = scores;
for (int score : scores) {
System.out.println(score);
}
System.out.println("数组类型");
}
}
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
//加载容器后,里面的class="com.jd.vo.Students",相当于创建并加载类,并调用构造方法——>创建对象
//创建对象时都是调用构造方法来创建的
}
<bean class="com.jd.vo.Students">
<constructor-arg name="scores">
<array>
<value>99</value>
<value>100</value>
</array>
</constructor-arg>
</bean>
输出结果:
99
100
数组类型
List集合
总结:如果参数类型是List集合,则用list标签里的value标签赋值
import java.util.List;
public class Students {
private List<String> names;
public Students(List<String> names) {
this.names = names;
for (String name : names) {
System.out.println(name);
}
System.out.println("List集合");
}
}
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
//加载容器后,里面的class="com.jd.vo.Students",相当于创建并加载类,并调用构造方法——>创建对象
//创建对象时都是调用构造方法来创建的
}
<bean class="com.jd.vo.Students">
<constructor-arg name="names">
<list>
<value>Tom</value>
<value>Jerry</value>
</list>
</constructor-arg>
</bean>
输出结果:
Tom
Jerry
List集合
Set集合
总结: 如果参数类型是Set集合,则用set标签里的value标签赋值
import java.util.Set;
public class Students {
private Set<String> ids;
public Students(Set<String> ids) {
this.ids = ids;
for (String id : ids) {
System.out.println(id);
}
System.out.println("Set集合");
}
}
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
<bean class="com.jd.vo.Students">
<constructor-arg name="ids">
<set>
<value>123456789</value>
<value>987654321</value>
</set>
</constructor-arg>
</bean>
输出结果:
123456789
987654321
Set集合
总结:
如果数组、List、Set集合中的参数类型是基本数据类型或String类型,则使用value标签,
否则使用bean子标签或ref子标签其中一个
import java.util.Date;
import java.util.List;
public class Students {
private List<Date> dates;
public Students(List<Date> dates) {
this.dates = dates;
for (Date date : dates) {
System.out.println(date);
}
}
}
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
<!--bean id="date" class="java.util.Date"/-->
<bean class="com.jd.vo.Students">
<constructor-arg name="dates">
<list>
<bean class="java.util.Date"/>
<!-- ref bean="date"/-->
</list>
</constructor-arg>
</bean>
输出结果:
Fri May 10 23:27:53 CST 2019
Map集合
总结:
- 如果参数类型是Map集合,则用Map标签赋值,元素使用entry
- 如果Map 集合中key或value是基本数据类型或者String类型,则使用key或value标签属性,否则使用key-ref或value-ref
import java.util.Date;
import java.util.Map;
import java.util.Set;
public class Students {
private Map<String,Date> birthdaies;
public Students(Map<String, Date> birthdaies) {
this.birthdaies = birthdaies;
Set<String> keys = birthdaies.keySet();//key是String类型,value是Date类型
for (String key : keys) {
Date birthday = birthdaies.get(key);
System.out.println(birthday);
}
System.out.println("Map集合");
}
}
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
<bean id="date" class="java.util.Date"/>
<bean class="com.jd.vo.Students">
<constructor-arg name="birthdaies">
<map>
<entry key="爸爸" value-ref="date"></entry>
<entry key="妈妈" value-ref="date"></entry>
</map>
</constructor-arg>
</bean>
输出结果:
Fri May 10 23:12:36 CST 2019
Fri May 10 23:12:36 CST 2019
Map集合