Spring中IoC创建对象方式

Ioc创建对象的方法分为无参构造创建和有参构造创建,首先看无参构造,也是Spring默认实现

这里给出一个User实体类

package com.zhiying.pojo;

public class User {
    private String name;

    public User() {
        System.out.println("无参构造");
    }

    public String getName() {
        return name;
    }

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

    public void show() {
        System.out.println("name=" + 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">

    <bean id="user" class="com.zhiying.pojo.User">
        <property name="name" value="贺志营"/>
    </bean>
</beans>

接下来进行测试

import com.zhiying.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 user = (User) context.getBean("user");
        user.show();
        User user1 = (User) context.getBean("user");
        System.out.println(user == user1);
    }
}

结果:

你会看到,我们并没有new对象,但是无参构造被调用了,说明我们的Spring调用了,也就是帮我们创建好了对象,我们随用随拿,而且能看出我们拿的是同一个对象。在配置文件被加载的时候,容器种管理的对象被初始化

有参构造有三种方法,先看第一种

package com.zhiying.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;
    }

    public void show() {
        System.out.println("name=" + 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">

<!--这是无参构造实现-->
<!--    <bean id="user" class="com.zhiying.pojo.User">-->
<!--        <property name="name" value="贺志营"/>-->
<!--    </bean>-->
<!--    有参构造,直接通过参数名来控制,最常用-->
    <bean id="user" class="com.zhiying.pojo.User">
        <constructor-arg name="name" value="贺志营"/>
    </bean>
</beans>
import com.zhiying.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 user = (User) context.getBean("user");
        user.show();
        User user1 = (User) context.getBean("user");
        System.out.println(user == user1);
    }
}

可以看到,也能出来,其中在配置文件中需要注意的是用constructor-arg而不是property了

第二种,在第一种的基础上改一下配置文件即可

<?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.zhiying.pojo.User">-->
<!--        <property name="name" value="贺志营"/>-->
<!--    </bean>-->

<!--    有参构造,直接通过参数名来控制,最常用-->
<!--    <bean id="user" class="com.zhiying.pojo.User">-->
<!--        <constructor-arg name="name" value="贺志营"/>-->
<!--    </bean>-->

<!--    有参构造通过类型创建,不常用-->
        <bean id="user" class="com.zhiying.pojo.User">
            <constructor-arg type="java.lang.String" value="贺志营"/>
        </bean>
</beans>

也可以运行出来

第三种,在第二种的基础上改一下配置文件即可

<?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.zhiying.pojo.User">-->
<!--        <property name="name" value="贺志营"/>-->
<!--    </bean>-->

<!--    有参构造,直接通过参数名来控制,最常用-->
<!--    <bean id="user" class="com.zhiying.pojo.User">-->
<!--        <constructor-arg name="name" value="贺志营"/>-->
<!--    </bean>-->

<!--    有参构造通过类型创建,不常用-->
<!--        <bean id="user" class="com.zhiying.pojo.User">-->
<!--            <constructor-arg type="java.lang.String" value="贺志营"/>-->
<!--        </bean>-->
<!--    有参构造通过下标赋值-->
    <bean id="user" class="com.zhiying.pojo.User">
        <constructor-arg index="0" value="贺志营"/>
    </bean>
</beans>

这样也可以出来,以上就是三种有参构造方法创建对象

发布了350 篇原创文章 · 获赞 236 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/HeZhiYing_/article/details/103934202