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

posted @   emanlee  阅读(981)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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 肿瘤基础知识
点击右上角即可分享
微信分享提示