本文编写于 127 天前,最后修改于 127 天前,其中某些信息可能已经过时。

上文说到 IOC 思想就是,通过 set 方法注入到 Spring 容器中,通过容器托管。

现在来看一下什么时候容器开始new一个新的对象。

public class User {
    private String name;

    public User() {
        System.out.println("User's NoArgsConstructor");
    }

    public String getName() {
        return name;
    }

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

首先在ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");和下面getBean前各加一个断点。
运行时第一个并没有什么效果。当getbean时,我们可以看见name=user被容器创建。
所以我们可以得出结论,容器在getBean时将对象创建。

这里我们看出使用了无参构造,如果只使用有参构造如何?

答案是会报错init(初始化)失败hhh。
如何解决这个问题,官网给出了解决方案。

Constructor Argument Resolution(构造器参数实现)

  1. 通过下标
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>
  1. 通过参数类型(如果多个相同类型则会按照顺序)
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>
  1. 直接通过参数名
<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>
 <bean id="user" class="com.springagain01.pojo.User">
     <constructor-arg name="name" value="jdskal"/>
 </bean>

(请把创建对象改口为创建bean)
使用有参构造则可以把set删去

当你再次创建一个类时并加载到bean当中,它在运行时也会同样的初始化。