Spring 调用有参构造实例化对象
调用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"); } }
————————————————
原文链接:https://blog.csdn.net/qq_43705275/article/details/103823735
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-08-16 为Endnote中的期刊名称添加缩写期刊名
2017-08-16 qvalue: Check that you have valid p-values or use a different range of lambda
2014-08-16 mysql 字符串函数
2011-08-16 WinRAR命令行参数
2011-08-16 水平集方法 level set method
2011-08-16 基底膜(basement membrane, BM)
2011-08-16 肿瘤基础知识