调用set方法在实例化对象的时候属性注入,用到了property标签或者p名称空间;
除了这种方式,还可以调用有参构造方法在实例化对象的时候属性注入,这种方式需要用到constructor-arg标签。
constructor-arg子标签:指定创建类对象时使用哪个构造函数,每一对或每一个constructor-arg子标签配置一个参数列表中的参数值;如果不配置该子标签,则默认使用无参构造函数实例化对象
调用多参构造方法实例化对象是如何确定调用哪个多参构造函数和如何确定给哪个参数传值的?
如果需要实例化的类中有多参构造方法,那么需要用到name、type或index等属性来指定调用哪个多参构造方法和给哪个参数传值,如果只有一个多参构造方法并且给参数传值的顺序与构造方法参数列表的顺序一致,则不需要用到这些属性。说明:
- name属性:通过参数名找到参数列表中对应参数
- index属性:通过参数在参数列表中的索引找到参数列表中对应参数,index从0开始
- type属性:通过参数数据类型找到参数列表中对应参数
- value属性:参数值
例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(String name,int age) {
System.out.println("参数name:" + name + ",参数age:" + age);
}
}
Spring XML文件中的配置方式:
方式1:按照顺序传值
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg value="张三"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
</bean>
方式2:根据type乱序传值
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg type="int" value="20"></constructor-arg>
<constructor-arg type="String" value="张三"></constructor-arg>
</bean>
方式3:根据index乱序传值
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg index="1" value="20"></constructor-arg>
<constructor-arg index="0" value="张三"></constructor-arg>
</bean>
方式4:根据name乱序传值
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg name="age" value="20"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
基本数据类型、String类与除String类以外的其他类型的数据是如何传值的?
基本数据类型与String类型:直接用constructor-arg标签的value属性,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(String name,int age) {
System.out.println("参数name:" + name + ",参数age:" + age);
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg value="张三"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
非String类类型:先用bean标签声明该类为其指定id,再用constructor-arg标签的ref属性,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(Date date) {
System.out.println("参数date:" + date);
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<bean id="date" class="java.util.Date"></bean>
<constructor-arg ref="date"></constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
数组:用constructor-arg标签的array子标签,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(Object[] array) {
System.out.println("参数array:");
for (Object object : array) {
System.out.println(object);
}
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg>
<array>
<value>12</value>
<value>张三</value>
<ref bean="date"/>
<bean class="java.lang.String">
<constructor-arg value="王二麻子"></constructor-arg>
</bean>
</array>
</constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
List集合:用constructor-arg标签的list子标签,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(List<Object> list) {
System.out.println("参数list:");
for (Object object : list) {
System.out.println(object);
}
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg>
<list>
<value>12</value>
<value>张三</value>
<ref bean="date"/>
<bean class="java.lang.String">
<constructor-arg value="王二麻子"></constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
Set集合:用constructor-arg标签的set子标签,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(Set<Object> set) {
System.out.println("参数set:");
for (Object s : set) {
System.out.println(s);
}
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg>
<set>
<value>12</value>
<value>张三</value>
<ref bean="date"/>
<bean class="java.lang.String">
<constructor-arg value="王二麻子"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
Map集合:用constructor-arg标签的map子标签,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(Map<String,Object> map) {
System.out.println("参数map:");
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key + ":" + map.get(key));
}
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg>
<map>
<entry key="name" value="张三"></entry>
<entry key="age" value="12"></entry>
<entry key="birthday" value-ref="date"></entry>
</map>
</constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下:
Properties集合:用constructor-arg标签的props子标签,例:
需要实例化的类:
package cn.jingpengchong.vo;
public class UserInfo {
public UserInfo(Properties properties) {
System.out.println("参数properties:");
System.out.println("driver:" + properties.getProperty("driver"));
System.out.println("userName:" + properties.getProperty("userName"));
System.out.println("password:" + properties.getProperty("password"));
System.out.println("url:" + properties.getProperty("url"));
}
}
Spring XML文件中的配置方式:
<bean class="cn.jingpengchong.vo.UserInfo">
<constructor-arg>
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="userName">root</prop>
<prop key="password">1234</prop>
<prop key="url">jdbc:mysql://127.0.0.1:3306/mytest</prop>
</props>
</constructor-arg>
</bean>
测试类的代码如下:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("application.xml");
}
}
运行结果如下: