Spring(五):IoC创建对象的方式

一、bean被创建的时间

考虑一个问题,我们都知道spring通过xml的配置创建bean,那么bean是什么时间被创建的呢?是在我们getBean()的时候创建的吗?

我们来做一个测试:

1.首先建立一个User类:

package com.jms.pojo;

public class User {
    private String name;

    public User() {
        System.out.println("User被创建了");
    }

    public String getName() {
        return name;
    }

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

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

我们在User的无参构造中加入了一个打印语句,当User被创建时就会打印出“User被创建了”。

2.然后对应的一个xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.jms.pojo.User">
        <property name="name" value="jms"/>
    </bean>

</beans>

3.一个测试

@Test
    public void userTest() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    }

这个测试只有创建容器这一行代码。

测试结果:

 

 

 由上可以看出,即使我们没有使用bean,bean也在创建容器的时候就被创建并且存放在了容器之中;还可以看出,创建bean的方式默认是调用无参构造。

二、IoC创建对象的方式

1.默认:通过无参构造进行创建

2.通过有参构造创建

虽然默认是通过无参构造进行创建,我们能不能通过有参构造进行创建呢?答案是可以的。

我们还是先来做个测试,用一个有参构造覆盖无参构造:

package com.jms.pojo;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

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

此时xml文件会报错:

 

 

 那么如何在xml中配置有参构造呢?

官方给出了三种方法:

(1)通过类型进行配置

   <bean id="user" class="com.jms.pojo.User">
        <constructor-arg type="java.lang.String" value="jms"/>
    </bean>

这种配置方法并不适用于有相同类型的情况,所以不建议用。

(2)通过索引进行配置

    <bean id="user" class="com.jms.pojo.User">
        <constructor-arg index="0" value="jms"/>
    </bean>

索引从0开始依次递增,由于我这里只有一个参数,所以只有一个0.

(3)通过参数名进行配置

   <bean id="user" class="com.jms.pojo.User">
        <constructor-arg name="name" value="jms"/>
    </bean>

这种方法应该是最简单明了的。

还有一种特殊情况就是传入的参数也是一个bean,这种情况官方同样给出了解决的方案:

package x.y;

public class ThingOne {

    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}
<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

 

 

(本文仅作个人学习记录用,如有纰漏敬请指正)

 

posted @ 2022-09-19 15:56  谁知道水烫不烫  阅读(125)  评论(0编辑  收藏  举报