如何为构造方法中不同数据类型参数赋值
bean 标签
作用:
用于配置对象让spring来创建的,默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
为bean标签添加id和name属性都可以通过调用getBean(id属性值或name某个属性值)方法获取到Spring IOC容器中的对象;但需要注意以下几点:
- id属性值只能定义一个标识,而name属性值可以使用分号(";")、空格(" “)或逗号(”,")分隔定义多个,如下代码
<bean id="helloWorld" name="hello;world" class="com.spring.test.HelloWorld"></bean>
可通过如下方式获取Spring IOC中的对象:
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("application.xml");
System.out.println(application.getBean("helloWorld"));//注意用这种方法获得的对象是Object类型的
System.out.println(application.getBean("hello"));
System.out.println(application.getBean("world"));
application.close();
- id和name属性值不能重复;
- bean标签中可以没有id和name属性,此时可以通过调用getBean(Class对象或类全名)方法获取到Spring IOC容器中的对象,如下所示:
<bean class="com.spring.test.HelloWorld"></bean>
可通过如下方式获取Spring IOC中的对象:
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("application.xml");
System.out.println(application.getBean(HelloWorld.class));
System.out.println(application.getBean("com.spring.test.HelloWorld"));
application.close();
constructor-arg子标签
constructor-arg子标签:指定创建类对象时使用哪个构造函数,每一对或每一个constructor-arg子标签配置一个参数列表中的参数值;如果不配置子标签,则默认使用无参构造函数实例化对象
属性
name属性:通过参数名找到参数列表中对应参数
index属性:通过参数在参数列表中的索引找到参数列表中对应参数,index从0开始:
type属性:通过参数数据类型找到参数列表中对应参数
value属性:设置参数列表参数对应的值,用于设定基本数据类型和String类型的数据
package com.spring.test;
public class Student {
public Student(String name, double score) {
System.out.println(name + ":" + score);
}
}
第一种配置方式:按照参数在参数列表中的正常顺序进行配置,此时不需要设置name、index或type属性:
<bean class="com.spring.test.Student">
<constructor-arg value="张三" ></constructor-arg>
<constructor-arg value="100" ></constructor-arg>
</bean>
第二种配置方式:如果不按照参数在参数列表中的正常顺序进行配置,则需要设定name、index或type属性,否则配置错误:
a、name属性
<bean class="com.spring.test.Student">
<constructor-arg name="score" value="100"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
b、index属性
<bean class="com.spring.test.Student">
<constructor-arg index="1" value="100"></constructor-arg>
<constructor-arg index="0" value="张三"></constructor-arg>
</bean>
c、type属性
<bean class="com.spring.test.Student">
<!-- 此时type可以为java.lang.Double吗?——不可以,要和参数数据类型严格一致 -->
<constructor-arg value="100" type="double"></constructor-arg>
<!-- 此时type可以为java.lang.Object吗?——不可以,要和参数数据类型严格一致 -->
<constructor-arg value="张三" type="java.lang.String"></constructor-arg>
</bean>
通过构造方法为不同数据类型参数赋值
无参构造方法
使用默认无参构造函数,会根据默认无参构造函数来创建类对象。如果bean中没有默认无参构造函数,将会创建失败。
如:
<bean id = "Student" class = "com.jd.vo.Student"></bean>
此时Student中必须有无参的构造函数。
有参构造方法
1.基本数据类型或String 使用value属性赋值
public Student(int age,String name){
System.out.println(age+","+name);
}
<bean class="com.jd.vo.Student">
<constructor-arg name = "age" value="12"></constructor-arg>
<constructor-arg name = "name" value="Jom"></constructor-arg>
</bean>
数组类型
public Student(int[] age){
for (int s:age) {
System.out.println(s);
}
}
<!--4.array 使用array标签-->
<bean name="in" class="java.lang.Integer">
<constructor-arg value="20"></constructor-arg>
</bean>
<bean class="com.jd.vo.Student">
<constructor-arg>
<array>
<value>10</value>
<ref bean="in"></ref>
<bean class="java.lang.Integer">
<constructor-arg value="18"></constructor-arg>
</bean>
<value>15</value>
</array>
</constructor-arg>
</bean>
类类型
public Student(Date birth){
System.out.println(birth);
}
<!--2.类类型,则使用ref属性赋值,同样的是给name赋值,但是该值是bean类型,必须在配置文件中配置。-->
<bean class = "com.jd.vo.Student">
<constructor-arg ref="d"></constructor-arg>
</bean>
List类型
//参数为List类型
public Student(List<String> student){
for (String s:student) {
System.out.println(s);
}
}
<!--3.List 使用list标签-->
<bean name="ss" class="java.lang.String">
<constructor-arg value="王三"></constructor-arg>
</bean>
<bean class = "com.jd.vo.Student">
<constructor-arg>
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
<bean class="java.lang.String"></bean>
<ref bean="ss"></ref>
</list>
</constructor-arg>
</bean>
Set类型
public Student(Set<String> mobiles){
for (String mobile:mobiles) {
System.out.println(mobile);
}
}
<!--5.set 使用set标签-->
<bean name="s" class="java.lang.String">
<constructor-arg value="119"></constructor-arg>
</bean>
<bean class="com.jd.vo.Student">
<constructor-arg>
<set>
<value>133235</value>
<bean class="java.lang.String">
<constructor-arg value="110"></constructor-arg>
</bean>
<ref bean="s"></ref>
</set>
</constructor-arg>
</bean>
Map类型
public Student(Map<String,String> map){
Set<String> set = map.keySet();
for(String key : set){
System.out.println(key+" ,"+map.get(key));
}
}
<!--6.Map 使用map标签-->
<bean name="k" class="java.lang.String">
<constructor-arg value="张三"></constructor-arg>
</bean>
<bean name="v" class="java.lang.String">
<constructor-arg value="张三"></constructor-arg>
</bean>
<bean class="com.jd.vo.Student">
<constructor-arg>
<map>
<entry key="王五" value="110"></entry>
<entry key-ref="k" value-ref="v"></entry>
</map>
</constructor-arg>
</bean>
Properties类型
public Student(Properties properties){
System.out.println(properties.getProperty("name"));//Jim
System.out.println(properties.getProperty("mobile"));//110
}
<!--7.Properties 使用props标签-->
<bean class="com.jd.vo.Student">
<constructor-arg>
<props>
<prop key="name">Jim</prop>
<prop key="mobile">110</prop>
</props>
</constructor-arg>
</bean>
通过set方法为不同数据类型参数赋值
方法一:
class Student {
private String name;
private int[] scores;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", scores=" + Arrays.toString(scores) +
'}';
}
public int[] getScores() {
return scores;
}
public void setScores(int[] scores) {
this.scores = scores;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
//默认情况下,new ClassPathXmlApplicationContext("application.xml")执行后,Spring自动调用类中无参构造方法;
//lazy-init = true,则不会随new ClassPathXmlApplicationContext("application.xml")执行而创建对象,什么时候获取该对象,什么时候创建
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
System.out.println(applicationContext.getBean("Student"));
//Student{name='Jim', scores=[98, 100, 98]}
}
}
<!--通过set方法赋值-->
<bean id="in" class="java.lang.Integer">
<constructor-arg value="100"></constructor-arg>
</bean>
<bean id = "Student" class="com.jd.vo.Student">
<property name="name" value="Jim"></property>
<property name="scores">
<array>
<value>98</value>
<ref bean ="in"></ref>
<bean class="java.lang.Integer">
<constructor-arg value="98"></constructor-arg>
</bean>
</array>
</property>
</bean>
方法二: