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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM