IOC创建对象方式

HeJin大约 2 分钟Spring全家桶Spring入门

无参构造默认实现

pojo实体类中必须要有无参构造方法。否则,程序会报错。

User.java

package com.kuang.pojo;

/**
 * @author Administrator
 */
public class User {
    private String name;

    public User(String name){

    }

    public String getName() {
        return name;
    }

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

    public void show(){
        System.out.println("name=" + name);
    }
}

没有无参构造方法,使用Spring容器会报错。

Caused by: java.lang.NoSuchMethodException: com.kuang.pojo.User.<init>()

有参构造

下标赋值

<?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">
    <!--(1)下标赋值!-->
    <bean id="user" class="com.kuang.pojo.User">
        <constructor-arg index="0" value="狂神说Java"/>
    </bean>

</beans>

结果:

name=狂神说Java

类型赋值

<?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">
<!--    &lt;!&ndash;(1)下标赋值!&ndash;&gt;-->
<!--    <bean id="user" class="com.kuang.pojo.User">-->
<!--        <constructor-arg index="0" value="狂神说Java"/>-->
<!--    </bean>-->
        <!--(2)通过类型创建:不建议使用-->
        <bean id="user" class="com.kuang.pojo.User">
            <constructor-arg type="java.lang.String" value="张三"/>
        </bean>

</beans>

结果:

name=张三

参数名设置

<?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">
<!--    &lt;!&ndash;(1)下标赋值!&ndash;&gt;-->
<!--    <bean id="user" class="com.kuang.pojo.User">-->
<!--        <constructor-arg index="0" value="狂神说Java"/>-->
<!--    </bean>-->
        <!--(2)通过类型创建:不建议使用-->
<!--        <bean id="user" class="com.kuang.pojo.User">-->
<!--            <constructor-arg type="java.lang.String" value="张三"/>-->
<!--        </bean>-->

    <!--(3)直接通过参数名设置-->
    <bean id="user" class="com.kuang.pojo.User">
        <constructor-arg name="name" value="狂神"/>
    </bean>

</beans>

结果:

name=狂神

好玩的东西

新建一个无参构造方法类,并在配置文件添加bean。

UserT.java

package com.kuang.pojo;

/**
 * @author Administrator
 */
public class UserT {
    private String name;

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

    public String getName() {
        return name;
    }

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

    public void show(){
        System.out.println("name=" + name);
    }
}

beans.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">
<!--    &lt;!&ndash;(1)下标赋值!&ndash;&gt;-->
<!--    <bean id="user" class="com.kuang.pojo.User">-->
<!--        <constructor-arg index="0" value="狂神说Java"/>-->
<!--    </bean>-->
        <!--(2)通过类型创建:不建议使用-->
<!--        <bean id="user" class="com.kuang.pojo.User">-->
<!--            <constructor-arg type="java.lang.String" value="张三"/>-->
<!--        </bean>-->

    <!--(3)直接通过参数名设置-->
    <bean id="user" class="com.kuang.pojo.User">
        <constructor-arg name="name" value="狂神"/>
    </bean>

    <bean id="userT" class="com.kuang.pojo.UserT">

    </bean>

</beans>

MyTest.java

import com.kuang.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        User bean = (User) context.getBean("user");
        bean.show();
    }
}

结果:

UserT被创建了!
name=狂神

由此可以发现:Spring容器在我们配置完bean,bean被注册之后,就已经创建完了对象。我们通过getBean去Spring容器中获取对象。

import com.kuang.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        User bean = (User) context.getBean("user");
        User bean1 = (User) context.getBean("user");
        bean.show();
        System.out.println(bean == bean);
    }
}

结果:

UserT被创建了!
name=狂神
true

内存中只有一份实例。

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!