SpringIOC創建對象的四種方式

我們平時創建對象的方式無非就是以下兩種:
有參構造 、無參構造
我們來看看在Spring中怎麼處理這兩種情況
首先我們先創建一個實體類:

package com.MLXH.pojo;

public class User {

    private String name;
    private String sex;
    private int age;

    public User() {
        System.out.println("User的無參構造");
    }

    public User(String name) {
        System.out.println("User的有參構造");
        this.name = name;
    }

    public User(String name, int age) {
        System.out.println("User的第二種有參構造");
        this.name = name;
        this.age = age;
    }

    public User(String name, String sex, int age) {
        System.out.println("User的第三種有參構造");
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public void setName(String name) {
        System.out.println(name);
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Spring創建對象的方式:

  • 通過有參構造
    • 通過下標
    • 通過參數名 【推薦】
    • 通過參數類型
  • 通過無參構造
    • 默認會用無參構造

注意點:實體類中一定要有一個無參構造方法
接下來我們看一下Spring是如何裝配這些對象的:

<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!--無參構造-->
	<bean id="user" class="com.MLXH.pojo.User">

    </bean>
    <!--無參構造,執行set方法-->
    <bean id="user1" class="com.MLXH.pojo.User">
        <property name="name" value="寒雪1"/>
    </bean>

    <!--使用構造器的參數下標進行賦值-->
    <bean id="user2" class="com.MLXH.pojo.User">
        <constructor-arg index="0" value="寒雪2"/>
        <constructor-arg index="1" value="18"/>
    </bean>

    <!--通過名字進行賦值-->
    <bean id="user3" class="com.MLXH.pojo.User">
        <constructor-arg name="name" value="寒雪3"/>
        <constructor-arg name="age" value="3"/>
    </bean>

    <!--通過類型進行賦值-->
    <bean id="user4" class="com.MLXH.pojo.User">
        <constructor-arg type="java.lang.String" value="寒雪4"/>
        <constructor-arg type="java.lang.Integer" value="18"/>
        <constructor-arg type="java.lang.String" value=""/>
    </bean>
</beans>

測試類:

package com.MLXH.pojo;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {
    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User)context.getBean("user1");
        System.out.println(user.toString());
    }
    @Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("user2");
        System.out.println(user);

    }
    @Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("user3");
        System.out.println(user);
    }
}

結果:運行第一個測試類的結果:在這裏插入圖片描述
分析:我們針對輸出的結果進行分析,我們拿到的是user1對象,那麼爲什麼會輸出這麼多的語句呢?
原因是我們執行了spring的配置文件bean.xml的全部內容,當執行ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");語句時,會加載beans.xml中的全部內容,因此其中所有的裝配信息都會進行加載,會按照我們裝配的順序進行加載。

注意:

<bean id="user1" class="com.MLXH.pojo.User">
        <property name="name" value="寒雪1"/>
</bean>

看似像是執行了有參構造,但其實是執行了無參構造,然後通過set方法將,name賦值進去的…就像是執行了這樣的代碼:

User user1 = new User();
user1.setName="寒雪1";

這只是執行了Test1的,其他的類似…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章